Skip to content

L1-046 整除光棍

Statement

Metadata

  • 作者: 翁恺
  • 单位: 浙江大学
  • 代码长度限制: 16 KB
  • 时间限制: 400 ms
  • 内存限制: 64 MB

这里所谓的“光棍”,并不是指单身汪啦~ 说的是全部由1组成的数字,比如1、11、111、1111等。传说任何一个光棍都能被一个不以5结尾的奇数整除。比如,111111就可以被13整除。 现在,你的程序要读入一个整数x,这个整数一定是奇数并且不以5结尾。然后,经过计算,输出两个数字:第一个数字s,表示x乘以s是一个光棍,第二个数字n是这个光棍的位数。这样的解当然不是唯一的,题目要求你输出最小的解。

提示:一个显然的办法是逐渐增加光棍的位数,直到可以整除x为止。但难点在于,s可能是个非常大的数 —— 比如,程序输入31,那么就输出3584229390681和15,因为31乘以3584229390681的结果是111111111111111,一共15个1。

输入格式

输入在一行中给出一个不以5结尾的正奇数x< 1000)。

输出格式

在一行中输出相应的最小的sn,其间以1个空格分隔。

输入样例

31

输出样例

3584229390681 15

Solution

#include <ctype.h>
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <deque>
#include <iostream>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <vector>

using namespace std;
typedef long long LL;

const double PI = 3.14159265358979323846264338327;
const double E = 2.718281828459;
const double eps = 1e-6;

const int MAXN = 0x3f3f3f3f;
const int MINN = 0xc0c0c0c0;
const int maxn = 1e5 + 5;
const int MOD = 1e9 + 7;

int main() {
    int n;
    cin >> n;
    LL ans;
    int len = 1;
    for (ans = 1; ans < n; ans = ans * 10 + 1) len++;
    while (1) {
        if (ans % n == 0) {
            cout << ans / n;
            break;
        } else {
            cout << ans / n;
            len++;
            ans %= n;
            ans = ans * 10 + 1;
        }
    }
    cout << " " << len << endl;
}

Last update: May 4, 2022
Back to top