HDU 5690 查找循环节 数学公式快速幂+乘法逆元(除法取模)
2016-05-21 19:42
531 查看
方法一 :因为m为10^10 次方,很大,所以猜测应该会出现循环节,
于是找到循环节映射出来即可
方法二:
m个x组成的数可以表示为x*(1+10+10^2+...+10^m-1)=x*(10^m-1)/9;
即x*(10^m-1)/9%k==c
x*(10^m-1)%(9*k)==9*c
用快速幂去做去做。
于是找到循环节映射出来即可
方法二:
m个x组成的数可以表示为x*(1+10+10^2+...+10^m-1)=x*(10^m-1)/9;
即x*(10^m-1)/9%k==c
x*(10^m-1)%(9*k)==9*c
用快速幂去做去做。
#include<cstdio> #include<cstring> #include<iostream> #define LL long long #define INF 0x3f3f3f3f #define bug puts("**********"); using namespace std; int vis2[200000]; int vis[1100000]; int main() { LL x,m,k,c; int t; scanf("%d",&t); for(int cas=1; cas<=t; cas++) { scanf("%lld%lld%lld%lld",&x,&m,&k,&c); LL sum=0; memset(vis2,-1,sizeof(vis2)); int start=-1,bit=0; printf("Case #%d:\n",cas); for(int i=0; i<m; i++) { sum=(sum*10+x)%k; vis[i]=sum; if(vis2[sum]!=-1) ///寻找循环节 { start=vis2[sum]; /// 循环开始的下标 bit=i-start; ///循环长度 break; } vis2[sum]=i; } if(start==-1) ///未出现循环节 { if(sum%k==c) puts("Yes"); else puts("No"); } else ///出现循环节 { if(m-1>=start) ///判断是否到达了循环的部分 { if(vis[(m-start-1)%bit+start]==c) ///哈希得到值 puts("Yes"); else puts("No"); } else { if(vis[m]==c) puts("Yes"); else puts("No"); } } } return 0; }
相关文章推荐
- MySQL数据库解压缩版(免安装版或zip版)无法输入中文,以及与Navicat中文显示一致的问题
- codeforces 670D1 Magic Powder - 1
- 九度OJ 1001:A+B for Matrices
- 在Android开发中使用MVP模式
- 中继器、集线器、网桥、交换机各个组件作用(转))
- 快速排序的分析与实现
- JS学习15(HTML5脚本编程)
- PAT 1015 德才论
- java抽象类练习
- asp.net发布到IIS中出现错误:处理程序“PageHandlerFactory-Integrated”在其模块列表中有一个错误模块“ManagedPipelineHandler”
- 解除百度云浏览器端对下载大文件的限制
- 坐标转换-终结者--OpenCoord提供下载了
- 2016年上半年软考网络工程师考试下午试题参考答案第一时间发布
- mina解决粘包,找不到解码器,数据帧重传的问题
- 16、在JavaScript中,命名的一些规范
- KMP,深入讲解next数组的求解
- Unity发布iOS后 闪屏图片 也就是splash image先黑一下 然后才显示
- 九度OJ 1000:计算A+B
- CRT与Windows的关系【转】
- 自定义view实现水波纹效果