题意:
给你一个n,问n的倍数中最小的循环整数是多少。循环整数的定义是一个没有前导0的整数有某一部分重复x次构成。
比如 11,123123,454454,像101不能写成0101而被看成循环整数。
解题思路:
对于一个长度为q的整数,循环节长度肯定是q的约数,比如长度为6的整数,循环节可以是1,2,3,不能是它本身,如果循环节长度是3的,必然可以写成1001*x,其中99 < x < 1000循环节长度为2的可以写成10101*x,其中9 < x < 100.
知道了整数是怎样构成的问题就变得很简单了,具体见代码。
/* **********************************************
Author : JayYe
Created Time: 2013-10-3 19:22:11
File Name : JayYe.cpp
*********************************************** */
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
typedef long long ll;
ll gcd(ll a, ll b) {
return b ? gcd(b, a%b) : a;
}
char s[11];
int mul[11];
int main() {
mul[0] = 1;
for(int i = 1;i <= 9; i++) mul[i] = mul[i-1]*10;
int t;
ll n;
scanf("%d", &t);
while(t--) {
scanf("%s", s);
int len = strlen(s);
sscanf(s, "%I64d", &n);
for(int i = len;i <= 18; i++) {
ll tmp = -1;
for(int j = 1;j <= i/2; j++) if(i % j == 0) {
ll cur = 1; // 构造出类似10101的乘数
for(int k = 1;k < i/j; k++)
cur = cur*mul[j] + 1;
ll d = gcd(cur, n);
ll x = n/d; // x最小为n/d,可以是n/d的倍数
if(x < mul[j]) {
// 求出满足范围的最小的x
ll y = mul[j-1]/x*x;
if(y < mul[j-1]) y += x;
if(tmp == -1 || tmp > y*cur) tmp = y*cur;
}
}
if(tmp != -1) {
printf("%I64d\n", tmp);
break;
}
}
}
return 0;
}