The Luckiest number
Chinese people think of ‘8’ as the lucky digit. Bob also likes digit ‘8’. Moreover, Bob has his own lucky number L. Now he wants to construct his luckiest number which is the minimum among all positive integers that are a multiple of L and consist of only digit ‘8’.
Input
The input consists of multiple test cases. Each test case contains exactly one line containing L(1 ≤ L ≤ 2,000,000,000).
The last test case is followed by a line containing a zero.
Output
For each test case, print a line containing the test case number( beginning with 1) followed by a integer which is the length of Bob’s luckiest number. If Bob can’t construct his luckiest number, print a zero.
Sample Input
8
11
16
0
Sample Output
Case
1: 1
Case
2: 2
Case
3: 0
解题思路:
这题 快速幂 会爆longlong,还得用 快速乘。
AC代码:
#include <cstdio>
#include <vector>
#include <queue>
#include <cstring>
#include <cmath>
#include <map>
#include <set>
#include <stack>
#include <string>
#include <iostream>
#include <algorithm>
#include <iomanip>
using namespace std
;
#define sd(n) scanf("%d",&n)
#define sdd(n,m) scanf("%d%d",&n,&m)
#define sddd(n,m,k) scanf("%d%d%d",&n,&m,&k)
#define pd(n) printf("%d\n", n)
#define pc(n) printf("%c", n)
#define pdd(n,m) printf("%d %d", n, m)
#define pld(n) printf("%lld\n", n)
#define pldd(n,m) printf("%lld %lld\n", n, m)
#define sld(n) scanf("%lld",&n)
#define sldd(n,m) scanf("%lld%lld",&n,&m)
#define slddd(n,m,k) scanf("%lld%lld%lld",&n,&m,&k)
#define sf(n) scanf("%lf",&n)
#define sc(n) scanf("%c",&n)
#define sff(n,m) scanf("%lf%lf",&n,&m)
#define sfff(n,m,k) scanf("%lf%lf%lf",&n,&m,&k)
#define ss(str) scanf("%s",str)
#define rep(i,a,n) for(int i=a;i<=n;i++)
#define per(i,a,n) for(int i=n;i>=a;i--)
#define mem(a,n) memset(a, n, sizeof(a))
#define debug(x) cout << #x << ": " << x << endl
#define pb push_back
#define all(x) (x).begin(),(x).end()
#define fi first
#define se second
#define mod(x) ((x)%MOD)
#define gcd(a,b) __gcd(a,b)
#define lowbit(x) (x&-x)
#define pii map<int,int>
#define mk make_pair
#define rtl rt<<1
#define rtr rt<<1|1
#define Max(x,y) (x)>(y)?(x):(y)
#define int long long
typedef pair
<int,int> PII
;
typedef long long ll
;
typedef unsigned long long ull
;
typedef long double ld
;
const int MOD
= 1e9 + 7;
const ll mod
= 1e9 + 7;
const double eps
= 1e-9;
const ll INF
= 0x3f3f3f3f3f3f3f3fll;
inline int read(){int ret
= 0, sgn
= 1;char ch
= getchar();
while(ch
< '0' || ch
> '9'){if(ch
== '-')sgn
= -1;ch
= getchar();}
while (ch
>= '0' && ch
<= '9'){ret
= ret
*10 + ch
- '0';ch
= getchar();}
return ret
*sgn
;}
inline void Out(int a
){if(a
>9) Out(a
/10);putchar(a
%10+'0');}
ll
qmul(ll a
,ll b
,ll mod
){ll res
=0;while(b
){if(b
&1)res
=(res
+a
)%mod
;a
=(a
+a
)%mod
;b
>>=1;}return res
;}
ll
qpow(ll m
,ll k
,ll mod
){ll res
=1%mod
,t
=m
%mod
;while(k
){if(k
&1)res
=qmul(res
,t
,mod
);t
=qmul(t
,t
,mod
);k
>>=1;}return res
;}
ll
gcd(ll a
,ll b
){if(b
> a
) swap(a
,b
); return b
==0?a
: gcd(b
,a
%b
);}
ll
lcm(ll a
,ll b
){return a
/gcd(a
,b
)*b
;}
ll
inv(ll x
,ll mod
){return qpow(x
,mod
-2,mod
)%mod
;}
int t
= 1,cas
= 1;
int n
,m
;
const int N
= 5e5+3;
int a
[N
],b
[N
];
int c1
[N
],c2
[N
];
int Euler(int n
) {
int m
= (int)sqrt(n
+ 0.5);
int ans
= n
;
for (int i
= 2; i
<= m
; ++i
) {
if (n
% i
== 0) {
ans
= ans
/ i
*(i
- 1);
while (n
% i
== 0) n
/= i
;
}
}
if (n
> 1) ans
= ans
/ n
*(n
- 1);
return ans
;
}
signed main()
{
while(cin
>>n
&& n
)
{
m
= (9*n
)/gcd(9*n
,8);
if(gcd(10,m
) != 1){
cout
<<"Case "<<cas
++<<": "<<0<<endl
;
}
else{
int phi
= Euler(m
);
int ans
= phi
;
for(int i
= 1; i
*i
<= phi
; i
++){
if(phi
%i
== 0){
if(qpow(10,i
,m
) == 1)
ans
= min(ans
,i
);
if(qpow(10,phi
/i
,m
) == 1)
ans
= min(ans
,phi
/i
);
}
}
cout
<<"Case "<<cas
++<<": "<<ans
<<endl
;
}
}
}