码迷,mamicode.com
首页 > 其他好文 > 详细

HDU 5690 All X

时间:2016-05-21 21:48:37      阅读:344      评论:0      收藏:0      [点我收藏+]

标签:

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 的真假(对于加减乘运算,取模可以移动,对于除法不可行。但此处 10m-1 表示有m个9组成的数,一定可以整除9,故可将9和k放在一起当模数)。接下来用快速幂就可以了。
 
 
 
 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*x%mod-x%mod == 9*c)
28             printf("Yes\n");
29         else
30             printf("No\n");
31     }
32     return 0;
33 }

 

HDU 5690 All X

标签:

原文地址:http://www.cnblogs.com/inmoonlight/p/5515538.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!