【题目链接】
http://poj.org/problem?id=3696
【算法】
设需要x个8
那么,这个数可以表示为 : 8(10^x - 1) / 9, 由题, L | 8(10^x - 1) / 9
令d = gcd(L,8),则 :
L | 8(10^x - 1) / 9
9L | 8 (10^x - 1) -> 9L/d | 10^x-1 -> 10^x(mod (9L/d)) = 1
易证a^x(mod n) = 1的最小正整数解是phi(n)的一个约数
那么,求出欧拉函数phi(9L/d),枚举约数,即可
【代码】
#include <algorithm> #include <bitset> #include <cctype> #include <cerrno> #include <clocale> #include <cmath> #include <complex> #include <cstdio> #include <cstdlib> #include <cstring> #include <ctime> #include <deque> #include <exception> #include <fstream> #include <functional> #include <limits> #include <list> #include <map> #include <iomanip> #include <ios> #include <iosfwd> #include <iostream> #include <istream> #include <ostream> #include <queue> #include <set> #include <sstream> #include <stdexcept> #include <streambuf> #include <string> #include <utility> #include <vector> #include <cwchar> #include <cwctype> #include <stack> #include <limits.h> using namespace std; typedef long long ll; int i,cnt,TC; ll factor[100010]; ll d,l,p; inline ll gcd(ll x,ll y) { if (y == 0) return x; else return gcd(y,x%y); } inline ll phi(ll n) { int i; ll ret = n; for (i = 2; i <= sqrt(n); i++) { if (n % i == 0) { ret = ret / i * (i - 1); while (n % i == 0) n /= i; } } if (n > 1) ret = ret / n * (n - 1); return ret; } inline ll mul(ll a,ll b,ll p) { ll ans = 0; while (b) { if (b & 1) ans = (ans + a) % p; a = a * 2 % p; b >>= 1; } return ans; } inline ll power(ll a,ll n) { ll b = a,ret = 1; while (n > 0) { if (n & 1) ret = mul(ret,b,d); b = mul(b,b,d); n >>= 1; } return ret; } int main() { while (scanf("%lld",&l) != EOF && l) { d = 9 * l / gcd(8,l); printf("Case %d: ",++TC); if (gcd(10,d) != 1) { printf("0\n"); continue; } else { cnt = 0; p = phi(d); for (i = 1; i <= sqrt(p); i++) { if (p % i == 0) { factor[++cnt] = i; if (i * i != p) factor[++cnt] = p / i; } } sort(factor+1,factor+cnt+1);for (i = 1; i <= cnt; i++) { if (power(10,factor[i]) == 1) { printf("%lld\n",factor[i]); break; } } } } return 0; }