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
1 <= x <= 9
1 <= m <= 1010
0 <= c < k <= 10,000
 
 
 
x,m,k,c
Output
对于每组数据,输出两行:
第一行输出:"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 }

 

posted on 2016-05-21 20:41  月夜下  阅读(803)  评论(1编辑  收藏  举报

导航

"320px">