【CODEVS1281】Xn数列
2016-02-19 20:42
295 查看
Description
给你6个数,m, a, c, x0, n, gXn+1 = ( aXn + c ) mod m,求Xn
m, a, c, x0, n, g<=10^18
Input
一行六个数 m, a, c, x0, n, gOutput
输出一个数 Xn mod gSample Input
11 8 7 1 5 3Sample Output
2HINT
int64按位相乘可以不要用高精度。题解
对于取模运算进行一个修改,将乘法修改为倍增乘法(类似于快速幂):long long Multiply (long long x, long long y) { long long ans = 0; while(y) { if(y & 1) ans = (ans + x) % m; x = (x << 1) % m; y >>= 1; } return ans; }
代码粘黄学长的
#include<iostream> #include<cstdio> #include<cstring> using namespace std; long long m,a,c,x0,n,g; long long Multiply (long long x,long long y) { long long ans=0; while (y) { if (y&1) ans=(ans+x)%m; x=(x<<1)%m; y>>=1; } return ans; } void mul(long long a[2][2],long long b[2][2]) { long long c[2][2]={{0,0},{0,0}}; for (int i=0;i<2;i++) for (int j=0;j<2;j++) for (int k=0;k<2;k++) c[i][j] = (c[i][j]+Multiply(a[i][k],b[k][j]))%m;//就是这里 memcpy(a,c,sizeof(c)); } int main() { cin>>m>>a>>c>>x0>>n>>g; long long f[2][2] = {{x0,1},{0,0}}; long long b[2][2] = {{a,0},{c,1}}; while(n) { if (n&1) mul(f,b); mul(b,b); n >>= 1; } cout<<f[0][0]%g; }
相关文章推荐
- UVA-10163 Storage Keepers (0-1背包)
- 绝对原创,Cheapest PBR Shader EVER!!!!
- 更新CocoaPods出现了错误
- css布局——百度前端技术学院
- js 实现长按效果(类似安卓的)
- 初探12306售票算法(二)-java代码实践
- js 实现长按效果(类似安卓的)
- java文件操作+流的使用
- codeforces 630D Hexagons!
- Mac安装MySQL初始密码设置
- maven项目tomcat编译后没有class文件
- HTML5离线存储原理及实现
- mysql阅读笔记二
- 6.10 Android 推送 极光推送
- java:堆栈,队列,枚举,链表
- Collections类
- String 截串
- 神经网络的学习 机器学习基础(4)
- android 正则表达式基础学习
- hdu 1045 解题报告