[关闭]
@Chilling 2016-08-11T15:28:39.000000Z 字数 881 阅读 1082

HDU-5690: All X(同余模运算)

数论


Description

代表一个全是由数字 组成的 位数字。请计算,以下式子是否成立:
mod

Input

第一行一个整数,表示组数据。
每组测试数据占一行,包含四个数字


Output

对于每组数据,输出两行:
第一行输出:"Case #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

分析: 表示同余,同余:两个整数a、b,若它们除以整数m所得的余数相等,则称a与b对于模m同余或a同余于b模m。
全是由数字x组成的m位数,如果直接循环求该数,由于m是,那么会超时,因此我们把它表示为,用快速幂求。判断 % 是否等于 % 即可(等式两边同时乘了9)。


  1. #include<stdio.h>
  2. #define LL long long
  3. LL quick(LL x,LL m,LL n)
  4. {
  5. LL ans=1;
  6. while(m>0)
  7. {
  8. if(m%2==1)
  9. ans=ans*x%n;
  10. x=x*x%n;
  11. m=m/2;
  12. }
  13. return ans;
  14. }
  15. int main()
  16. {
  17. int i,t,tt=0;
  18. LL x,m,k,c,s;
  19. scanf("%d",&t);
  20. while(t--)
  21. {
  22. tt++;
  23. scanf("%lld%lld%lld%lld",&x,&m,&k,&c);
  24. s=quick(10,m,k); //(10^m-1)/9*x,先求10^m%k
  25. s*=x; //求x*10^m%k
  26. s=(s-x%k+k)%k; //(x*10^m%k-x%k)%k,x%k+k是为了防止小于0
  27. printf("Case #%d:\n",tt);
  28. if(s==(9*c)%k)
  29. printf("Yes\n");
  30. else
  31. printf("No\n");
  32. }
  33. return 0;
  34. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注