[BZOJ2875]NOI2012随机数生成器|矩阵乘法
2015-06-20 21:40
519 查看
一开始想用等比数列公式搞,但是模数可能为合数。。然后裸上矩乘,注意要用快速乘要不然会爆long long。
#include<cstdio> #include<iostream> #include<cmath> #include<memory.h> #define ll long long using namespace std; ll m,a,c,x0,n,g,an; struct ju{ ll a[2][2]; int n,m; }ans,t; ll mul(ll a,ll b) { if (b>a) swap(a,b); if (b==0) return 0ll; ll c=mul(a,b/2); c=(c+c)%m; if (b%2==1) c=(c+a)%m; return c; } ju operator*(ju a,ju b) { ju ans; memset(ans.a,0,sizeof(ans.a)); ans.n=a.n;ans.m=b.m; for (int i=0;i<a.n;i++) for (int j=0;j<b.n;j++) for (int k=0;k<b.m;k++) ans.a[i][k]=(ans.a[i][k]+mul(a.a[i][j],b.a[j][k]))%m; return ans; } ju pow(ju a,ll b) { if (b==1) return a; ju c=pow(a,b/2); c=c*c; if (b%2==1) c=c*a; return c; } int main() { scanf("%lld%lld%lld%lld%lld%lld",&m,&a,&c,&x0,&n,&g); t.a[0][0]=1ll;t.a[0][1]=0ll;t.a[1][0]=1ll;t.a[1][1]=a;t.n=2;t.m=2; ans.a[0][0]=c;ans.a[1][0]=x0;ans.n=2;ans.m=1; ans=pow(t,n)*ans; cout<<ans.a[1][0]%g; }
相关文章推荐
- UCS-2和UTF8的四个新知识点和新的疑问
- 读后感
- 《人,绩效和道德》有感
- 测试与调试
- POJ基本算法bfs1753,2965
- UVa1152 - 4 Values whose Sum is 0(hash)
- Linux文件权限详解(一)
- 人,绩效和职业道德读后感
- android 绘制自定义控件
- 判断应用程序.exe及动态链接库.dll是32位还是64位
- [BZOJ3670]NOI2014动物园|KMP
- C++基本知识点总结
- JavaScript入门-第1章 请做好准备
- AnsiStartsStr 和 空字符串
- Linux的进程调度机制在哪个文件目录下?
- [BZOJ3669]NOI2014魔法森林|LCT|最小生成树
- 切割图像(一)概要
- Android View 无处不在的图片查看器~ 不服就看
- Linux进程调度机制
- UVa1605 - Building for UN(构造)