HDU 5690 All X
All X
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 442 Accepted Submission(s): 203
Problem Description
F(x,m)代表一个全是由数字x组成的m位数字。请计算,以下式子是否成立:
F(x,m) mod k ≡ c
Input
第一行一个整数T,表示T组数据。
每组测试数据占一行,包含四个数字x, m, k, c
每组测试数据占一行,包含四个数字x, m, k, c
1 <= x <= 9
1 <= m <= 1010
0 <= c < k <= 10,000
x,m,k,c
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
Hint
对于第一组测试数据:111 mod 5 = 1,公式不成立,所以答案是”No”,而第二组测试数据中满足如上公式,所以答案是 “Yes”。
Source
解析:数学变形+快速幂。全是由数字x组成的m位数可表示为(10m-1)/9*x。
则判断 (10m-1)/9*x%k == c 的真假可转化为判断 (10m-1)*x%(9*k) == 9*c 的真假(因为不能确定 k 为质数,无法使用逆元的概念求解,只能根据a/b%m == a%(m*b)/b来计算)。接下来用快速幂就可以了。
1 #include <cstdio> 2 3 int t; 4 long long x, m, k, c; 5 6 long long quickpowmod(long long x, long long y, long long mod) 7 { 8 long long ret = 1; 9 while(y){ 10 if(y&1) 11 ret = ret*x%mod; 12 x = x*x%mod; 13 y >>= 1; 14 } 15 return ret; 16 } 17 18 int main() 19 { 20 scanf("%d", &t); 21 int cn = 0; 22 while(t--){ 23 scanf("%I64d%I64d%I64d%I64d", &x, &m, &k, &c); 24 printf("Case #%d:\n", ++cn); 25 long long mod = 9*k; 26 long long p = quickpowmod(10, m, mod); 27 if((p-1)*x%mod == 9*c) 28 printf("Yes\n"); 29 else 30 printf("No\n"); 31 } 32 return 0; 33 }