P1707 刷题比赛

    • 10通过
    • 38提交
  • 题目提供者nodgd
  • 标签倍增递推矩阵洛谷原创
  • 难度提高+/省选-

提交该题 讨论 题解 记录

最新讨论

题目背景

nodgd是一个喜欢写程序的同学,前不久洛谷OJ横空出世,nodgd同学当然第一时间来到洛谷OJ刷题。于是发生了一系列有趣的事情,他就打算用这些事情来出题恶心大家……

题目描述

洛谷OJ当然算是好地方,nodgd同学打算和朋友分享一下。于是他就拉上了他的朋友Ciocio和Nicole两位同学一起刷题。喜欢比赛的他们当然不放过这样一次刷题比赛的机会!

在第1天nodgd,Coicoi,Nicole都只做了1道题。

在第2天nodgd,Coicoi,Nicole都只做了3道题。

他们都有着严格的刷题规则,并且会在每一天都很遵守规则的刷一定量的题。

(1)nodgd同学第k+2天刷题数量a[k+2]=p*a[k+1]+q*a[k]+b[k+1]+c[k+1]+r*k^2+t*k+1;

(2)Ciocio同学第k+2天刷题数量b[k+2]=u*b[k+1]+v*b[k]+a[k+1]+c[k+1]+w^k;

(3)Nicole同学第k+2天刷题数量c[k+2]=x*c[k+1]+y*c[k]+a[k+1]+b[k+1]+z^k+k+2;

(以上的字母p,q,r,t,u,v,w,x,y,z都是给定的常数,并保证是正整数)

于是他们开始了长时间的刷题比赛!一共进行了N天(4<=N<=10^16)

但是时间是可贵的,nodgd想快速知道第N天每个人的刷题数量。不过nodgd同学还有大量的数学竞赛题、物理竞赛题、英语竞赛题、美术竞赛题、体育竞赛题……要做,就拜托你来帮他算算了。

由于结果很大,输出结果mod K的值即可。

输入输出格式

输入格式:

第一行两个正整数N,K。(4<=N<=10^16,2<=K<=10^16)

第二行四个正整数p,q,r,t。

第三行三个正整数u,v,w。

第四行三个正整数x,y,z。

(保证p,q,r,t,u,v,w,x,y,z都是不超过100的正整数)

输出格式:

共三行,每行一个名字+一个空格+一个整数。依次是nodgd,Ciocio,Nicole和他们在第N天刷题数量mod K的值。

输入输出样例

输入样例#1:

4 10007
2 1 1 1
2 2 3
1 1 2
输出样例#1:

nodgd 74
Ciocio 80
Nicole 59

说明

矩阵乘法。

注意,中间相乘过程可能会比64位长整型的数据范围还要大。

看到数据范围很大,之后异想天开,以为一定会答案循环,再加上快速幂,最多也只是50分。

#include<cstdio>
#include<iostream>
#define ll long long
using namespace std;
const int N=2e5+;
ll n,mod;
ll a[N]={,,};
ll b[N]={,,};
ll c[N]={,,};
ll kpow(ll a,ll p){
ll ans=;
for(;p;p>>=,a=(a*a)%mod) if(p&) ans=(ans*a)%mod;
return ans;
}
int main(){
//freopen("sh.txt","r",stdin);
int p,q,r,t,u,v,w,x,y,z;ll ma(),mb(),mc();bool fa(),fb(),fc();
cin>>n>>mod;
cin>>p>>q>>r>>t>>u>>v>>w>>x>>y>>z;
if(mod==){printf("nodgd 0\nCiocio 0\nNicole 0\n");return ;}
if(n==){printf("nodgd 1\nCiocio 1\nNicole 1\n");return ;}
if(n==){printf("nodgd %d\nCiocio %d\nNicole %d\n",%mod,%mod,%mod);return ;}
for(ll i=;i<=n;i++){
a[i]=(p*a[i-]%mod+q*a[i-]%mod+b[i-]+c[i-]+r%mod*kpow((i-)%mod,)%mod+t*(i-)%mod+)%mod;
b[i]=(u*b[i-]%mod+v*b[i-]%mod+a[i-]+c[i-]+kpow(w%mod,(i-))%mod)%mod;
c[i]=(x*c[i-]%mod+y*c[i-]%mod+a[i-]+b[i-]+kpow(z%mod,(i-))%mod+i)%mod;
if(a[i]==a[]&&a[i-]==a[]){ma=i-;fa=;}
if(b[i]==b[]&&b[i-]==b[]){mb=i-;fb=;}
if(c[i]==c[]&&c[i-]==c[]){mc=i-;fc=;}
if(fa&&fb&&fc) break;
}
if(fa&&fb&&fc){
cout<<"nodgd "<<a[n%ma]<<endl;
cout<<"Ciocio "<<b[n%mb]<<endl;
cout<<"Nicole "<<c[n%mc]<<endl;
}
else{
cout<<"nodgd "<<a[n]<<endl;
cout<<"Ciocio "<<b[n]<<endl;
cout<<"Nicole "<<c[n]<<endl;
}
return ;
}

看到标签,“矩阵乘法”,去网上看了看矩阵乘法

附上AC代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#define ll long long
using namespace std;
ll n,mod,p,q,r,t,u,v,w,x,y,z;
ll f[][],a[][];
ll slow_mul(ll a,ll b){
ll ans=;
while(b){
if(b&){
b--;ans+=a;ans%=mod;
}
a<<=;a%=mod;b>>=;
}
return ans;
}
void mul(ll a[][],ll b[][]){
ll c[][];memset(c,,sizeof(c));
for(int i=;i<=;i++)
for(int j=;j<=;j++)
for(int k=;k<=;k++)
c[i][j]=(c[i][j]+slow_mul(a[i][k],b[k][j]))%mod;
for(int i=;i<=;i++)
for(int j=;j<=;j++)
a[i][j]=c[i][j];
}
int main()
{
cin>>n>>mod>>p>>q>>r>>t>>u>>v>>w>>x>>y>>z;n-=;
f[][]=f[][]=f[][]=;f[][]=f[][]=f[][]=;
f[][]=f[][]=f[][]=;f[][]=w;f[][]=z;
a[][]=p;a[][]=q;a[][]=r;a[][]=t;a[][]=u;
a[][]=v;a[][]=x;a[][]=y;a[][]=a[][]=;
a[][]=w;a[][]=z;
a[][]=a[][]=a[][]=a[][]=a[][]=a[][]=;
a[][]=a[][]=a[][]=a[][]=a[][]=a[][]=;
a[][]=a[][]=a[][]=a[][]=a[][]=a[][]=;
while(n){
if(n&)mul(f,a);
mul(a,a);n>>=;
}
cout<<"nodgd"<<" "<<f[][]<<endl;
cout<<"Ciocio"<<" "<<f[][]<<endl;
cout<<"Nicole"<<" "<<f[][]<<endl;
return ;
}

P1707 刷题比赛的更多相关文章

  1. [洛谷P1707] 刷题比赛

    洛谷题目连接:刷题比赛 题目背景 nodgd是一个喜欢写程序的同学,前不久洛谷OJ横空出世,nodgd同学当然第一时间来到洛谷OJ刷题.于是发生了一系列有趣的事情,他就打算用这些事情来出题恶心大家-- ...

  2. luogu题解 P1707 【刷题比赛】矩阵加速递推

    题目链接: https://www.luogu.org/problemnew/show/P1707 分析: 洛谷的一道原创题,对于练习矩阵加速递推非常不错. 首先我们看一下递推式: \(a[k+2]= ...

  3. 【洛谷 P1707】 刷题比赛 (矩阵加速)

    题目连接 很久没写矩阵加速了,复习一下,没想到是一道小毒瘤题. 状态矩阵\(a[k],b[k],c[k],a[k+1],b[k+1],c[k+1],k,k^2,w^k,z^k,1\) 转移矩阵 0, ...

  4. [luogu1707] 刷题比赛 [矩阵快速幂]

    题面: 传送门 思路: 一眼看上去是三个递推......好像还挺麻烦的 仔细观察一下,发现也就是一个线性递推,但是其中后面的常数项比较麻烦 观察一下,这里面有以下三个递推是比较麻烦的 第一个是$k^2 ...

  5. ubuntu下vim配置(刷题和比赛两套)

    1. 平时刷题练习使用 "mswin.vim 插件提供windows下的编辑快捷键功能 source $VIMRUNTIME/mswin.vim behave mswin set nu se ...

  6. ife任务刷题总结(一)-css reset与清除浮动

    本文同时发布于本人的个人网站www.yaoxiaowen.com 百度创办的前端技术学院,是一个面向大学生的前端技术学习平台.虽然只有大学生才有资格报名,提交代码进行比赛排名.但是这并不妨碍我们这些初 ...

  7. 【刷题记录】BZOJ-USACO

    接下来要滚去bzoj刷usaco的题目辣=v=在博客记录一下刷题情况,以及存一存代码咯.加油! 1.[bzoj1597][Usaco2008 Mar]土地购买 #include<cstdio&g ...

  8. NOIp2018停课刷题记录

    Preface 老叶说了高中停课但是初中不停的消息后我就为争取民主献出一份力量 其实就是和老师申请了下让我们HW的三个人听课结果真停了 那么还是珍惜这次机会好好提升下自己吧不然就\(AFO\)了 Li ...

  9. 【刷题】BZOJ 2407 探险

    Description 探险家小T好高兴!X国要举办一次溶洞探险比赛,获奖者将得到丰厚奖品哦!小T虽然对奖品不感兴趣,但是这个大振名声的机会当然不能错过! 比赛即将开始,工作人员说明了这次比赛的规则: ...

随机推荐

  1. 读写锁:ReadWriteLock

    http://my.oschina.net/20076678/blog/173165   一.在JDK文档中关于读写锁的相关说明 ReadWriteLock 维护了一对相关的 锁 ,一个用于只读操作, ...

  2. 32.怎样在Swift中实现TabBar和导航视图结合的项目?

    导航栏和TabBar结合的项目,在我们平常开发中会经常看到,下面我们通过自定义的TabBar来实现一个导航和TabBar结合的Demo. 1.自定义TabBar import UIKit class ...

  3. C#高性能大容量SOCKET并发(一):IOCP完成端口例子介绍(转)

    原文地址 http://blog.csdn.net/SQLDebug_Fan/article/details/17556353 例子主要包括SocketAsyncEventArgs通讯封装.服务端实现 ...

  4. IIS网站程序无法访问oracle

    系统环境: win7 + iis7 asp.net应用程序访问oracle数据库时,报ORA-12560: TNS: 协议适配器错误. 使用c/s程序访问数据库没有问题,plsql也没问题,说明ora ...

  5. 用ICSharpCode.SharpZipLib进行压缩

    今天过中秋节,当地时间(2013-09-08),公司也放假了,正好也闲着没事,就在网上学习学习,找找资料什么的.最近项目上可能会用到压缩的功能,所以自己就先在网上学习了,发现一个不错的用于压缩的DLL ...

  6. Swift学习笔记九

    闭包 闭包是指能够在代码中使用和传递的自包含(self-contained)的块. Swift中的闭包和C以及OC中的块很相似.它们可以捕获并且存储定义它们的上下文中的任何常量和变量的引用.Swift ...

  7. 反射遍历List<>泛型类型

    有这样一个需求:一个实体模型,有一个属性是一个实体列表List<OrderDetail>,我需要对实体列表遍历,对每一个实体的属性根据属性特性进行验证,如是否为必填等等,如下一个反射方法能 ...

  8. Codeforces Round #339 (Div. 2) B. Gena's Code 水题

    B. Gena's Code 题目连接: http://www.codeforces.com/contest/614/problem/B Description It's the year 4527 ...

  9. [Unity3D]Unity3D游戏开发之使用EasyTouch虚拟摇杆控制人物移动

    大家好,欢迎大家关注我的博客,我是秦元培,我的博客地址是blog.csdn.net/qinyuanpei.今天呢,我们来一起学习在Unity3D中使用EasyTouch虚拟摇杆来控制人物移动.虽然Un ...

  10. AJAX responseText vs responseXML

    AJAX------>本质 Request/Response(Server)模式 response的形式 responseText--------->获得字符串形式的响应数据. ----- ...