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
每组测试数据占一行,包含四个数字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 的真假(对于加减乘运算,取模可以移动,对于除法不可行。但此处 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——————快速幂 | 循环节