今天,[kzj](https://www.cnblogs.com/kzj-pwq/)大佬教了我矩阵加速。

让我以这篇随笔表示感谢吧!

这是我刷的一道NOI2012 随机数据生成器

就是普通的矩阵加速,只是要注意的是:

直接用乘法会爆long long,可以参考一下 黑科技 慢速乘

可以把乘法转换成加法,很好取模。

贴上丑陋的代码吧~ 忽略函数名

#include <bits/stdc++.h>
using namespace std;
typedef long long ull; const ull A=0;
ull m,a,c,x0,n,g;
ull f[3],t[3][3]={
{0,0,0},
{0,A,0},
{0,1,1}
}; ull suan(ull x,ull y)
{
ull ans=0;
while (y) {
if (y&1)
ans=((ans%m)+(x%m))%m;
x=((x%m)+(x%m))%m;
y>>=1;
}
return ans;
} ull fuyan()
{
ull d[3];
memcpy(d,f,sizeof(d));
memset(f,0,sizeof(f));
for (int i=1;i<=2;++i)
for (int j=1;j<=2;++j)
f[i]=(f[i]%m+suan(d[j]%m,t[j][i]%m))%m;
} ull yuzhouzhou()
{
ull d[3][3];
memcpy(d,t,sizeof(d));
memset(t,0,sizeof(t));
for (int i=1;i<=2;++i)
for (int j=1;j<=2;++j)
for (int k=1;k<=2;++k)
t[i][j]=(t[i][j]%m+suan(d[i][k]%m,d[k][j]%m))%m;
} ull work(ull p)
{
while (p) {
if (p&1)
fuyan();
yuzhouzhou();
p>>=1;
}
return f[1];
} int main()
{
cin>>m>>a>>c>>x0>>n>>g;
t[1][1]=a%m;
f[1]=x0;f[2]=c;
cout<<work(n)%g<<"\n";
return 0;
}

最新文章

  1. python学习笔记(基础四:模块初识、pyc和PyCodeObject是什么)
  2. HTML DOM元素的Dragdrop
  3. [转]CentOS-6.3安装配置cmake
  4. docker图形界面工具
  5. 循序渐进Python3(三) -- 3 -- 内置函数
  6. js浮点数精确计算(加、减、乘、除)
  7. html标签属性大全
  8. NoSQL聚合数据模型
  9. 分页写入文件,第二次分页前一定要关闭IO流啊。。否则文件写不全。。- -粗心
  10. 服务器无法播放flv格式的视频解决办法
  11. PP常用T-CODE
  12. POJ 1200 Crazy Search
  13. Android ScrollView用法
  14. poj3928 Ping pong 树状数组
  15. 【嵌入式开发】写入开发板Linux系统-模型S3C6410
  16. 使用node-livereload自动刷新页面
  17. Spring框架之IOC(控制反转)
  18. linux 系统中的 /bin /sbin /usr/bin /usr/sbin /usr/local/bin /usr/local/sbin 目录的区别
  19. 结合JDK源码看设计模式——装饰者模式
  20. pyhthon 利用爬虫结合阿里大于短信接口实现短信发送天气预报

热门文章

  1. 转: java语法与ide级入门介绍 from: IBM dev
  2. Error:[$parse:lexerr]
  3. synchronized的功能拓展:重入锁(读书笔记)
  4. 【Shell】Read命令
  5. Hbase 认识及其作用
  6. Mac 下Versions的 svn无法上传 .a 文件的问题
  7. 1045. Favorite Color Stripe (30) -LCS同意元素反复
  8. Qemu事件处理机制简介
  9. 使用WebStorm将项目部署到IIS
  10. PHPMailer 使用 中文乱码