HDU 5690 All X

Posted 月夜下

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 的真假(对于加减乘运算,取模可以移动,对于除法不可行。但此处 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的主要内容,如果未能解决你的问题,请参考以下文章

HDU 5690——All X——————快速幂 | 循环节

百度之星初赛2A 1001 ALL X(HDU 5690)

HDU 5690 All X 暴力循环节

hdu-5690 All X(快速幂+乘法逆元)

HDU 5690 All X的多种算法(2016"百度之星" - 初赛(Astar Round2A)1001)

2016"百度之星" - 初赛(Astar Round2A)1001 All X(HDU5690)——找循环节|快速幂