HDU_5690_快速幂,同余的性质
All X
Time Limit: 2000/1000 MS (Java/Others)
Memory Limit: 65536/65536 K (Java/Others)
Problem Description
F(x,m) 代表一个全是由数字x组成的m位数字。请计算,以下式子是否成立:
F(x,m) mod k ≡ c
F(x,m) mod k ≡ c
Input
第一行一个整数T,表示T组数据。
每组测试数据占一行,包含四个数字x,m,k,c
1≤x≤9
1≤m≤10^10
0≤c<k≤10,000
每组测试数据占一行,包含四个数字x,m,k,c
1≤x≤9
1≤m≤10^10
0≤c<k≤10,000
Output
对于每组数据,输出两行:
第一行输出:"Case #i:"。i代表第i组测试数据。
第二行输出“Yes” 或者 “No”,代表四个数字,是否能够满足题目中给的公式。
第一行输出:"Case #i:"。i代表第i组测试数据。
第二行输出“Yes” 或者 “No”,代表四个数字,是否能够满足题目中给的公式。
Sample Input
3
1 3 5 2
1 3 5 1
3 5 99 69
Sample Output
Case #1:
No
Case #2:
Yes
Case #3:
Yes
同余的性质还需要熟悉。
思路:
m个x组成的数可以表示为x*(1+10+10^2+...+10^m-1)=x*(10^m-1)/9;
即x*(10^m-1)/9%k==c? x*(10^m-1)%(9*k)==9*c
同余的性质:
(1)自反性:a≡a(mod m).
(2)对称性:若a≡b(mod m),则b≡a(mod m).
(3)传递性:若a≡b(mod m),b≡c(mod m),则a≡c(mod m).
若a1≡b1(mod m),a2≡b2(mod m),
(4) 则a1+a2≡b1+b2(mod m)
推论:若a+b≡c(mod m),则a≡c-b(mod m)
(5) a1a2≡b1b2(mod m).
推论1:若a≡b(mod m),则ak≡bk(mod m),其中k为整数.
推论2:若a≡b(mod m),则a^n≡b^n(mod m),其中n为自然数.
(6) 若ac≡bc(mod m),(m,c)=d, 则a≡b(mod m/d).
特别地,当(m,c)=1是,有a≡b(mod m).
(7) 若a≡b(mod m),则ak≡bk(mod mk),其中k为大于零的整数;
若a≡b(mod m),d为a,b及m 的任一正公约数,则a/d≡b/d(mod (m/d)).
(8) a≡b(mod mi),(1<=i<=n),则a≡b(mod [m1,m2,…,mn]).
(9) 若a≡b(mod m),且d|m,则a≡b(mod d)
此题用到了第(7)条性质。
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<stdlib.h> using namespace std; #define LL long long LL powMod(LL base,LL m,int mod) { LL res=1; while(m) { if(m&1) res=(res*base)%mod; base=(base*base)%mod; m>>=1; } return(res%mod); } int main() { int x,k,c,cas=1; LL m; int t; scanf("%d",&t); while(t--) { scanf("%d%I64d%d%d",&x,&m,&k,&c); //cout<<"*"<<endl; int MOD=9*k; int tmp=powMod(10,m,MOD); //cout<<tmp<<endl; tmp=(tmp*x)%MOD; tmp-=(x%MOD); //cout<<tmp<<endl; printf("Case #%d:\n",cas++); if(tmp==9*c) printf("Yes\n"); else printf("No\n"); } return 0; }