社区讨论
神仙溢出未解之谜
P1939矩阵加速(数列)参与者 2已保存回复 3
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 3 条
- 当前快照
- 1 份
- 快照标识符
- @mhj2yc9a
- 此快照首次捕获于
- 2025/11/03 19:52 4 个月前
- 此快照最后确认于
- 2025/11/03 19:52 4 个月前
CPP
#include<iostream>
#include<cstring>
using namespace std;
const int mod=10000007;
struct Matrix
{
int n,m;
int sum[50][50];
void clear()
{
memset(sum,0,sizeof(sum));
}
friend Matrix operator * (Matrix a,Matrix b)
{
Matrix c;
c.n=a.n,c.m=b.m;
for(int i=1;i<=c.n;i++)
{
for(int j=1;j<=c.m;j++)
{
int t=0;
for(int k=1;k<=a.m;k++)
{
t+=a.sum[i][k]*b.sum[k][j];
}
c.sum[i][j]=t;
}
}
return c;
}
friend Matrix operator + (Matrix a,Matrix b)
{
Matrix c;
c.n=a.n;
c.m=a.m;
for(int i=1;i<=a.n;i++)
{
for(int j=1;j<=a.m;j++)
{
c.sum[i][j]=(a.sum[i][j]+b.sum[i][j])%mod;
}
}
return c;
}
friend Matrix operator % (Matrix a,int d)
{
Matrix c;
c.n=a.n,c.m=a.m;
for(int i=1;i<=a.n;i++)
{
for(int j=1;j<=a.m;j++)
{
c.sum[i][j]=a.sum[i][j]%d;
}
}
return c;
}
};
Matrix qpow(Matrix a,int p)
{
Matrix ret;
ret.clear();
ret.n=ret.m=a.n;
for(int i=1;i<=ret.n;i++)
{
ret.sum[i][i]=1;
}
while(p)
{
if(p&1)
{
ret=ret*a%mod;
}
p>>=1;
a=a*a%mod;
}
ret=ret%mod;
return ret;
}
int main()
{
int T;
cin >> T;
Matrix t,c;
t.n=t.m=3;
t.sum[1][1]=t.sum[1][3]=t.sum[2][1]=t.sum[3][2]=1;
c.n=3,c.m=1;
c.sum[1][1]=1,c.sum[2][1]=1,c.sum[3][1]=1;
Matrix ans;
while(T--)
{
int n;
cin >> n;
if(n<=3)
{
cout << 1 << '\n';
continue;
}
ans.clear();
ans=qpow(t,n-3);
// for(int i=1;i<=3;i++)
// {
// for(int j=1;j<=3;j++)
// {
// cout << ans.sum[i][j] << ' ';
// }
// cout << '\n';
// }
ans=ans*c;
cout << ans.sum[1][1] << '\n';
}
return 0;
}
这份代码只要在本地运行样例就会输出奇怪的数字如下
15885276
22264369
14429349
但在你谷IDE上运行样例就会输出正确的答案,经过尝试后发现只要加上
#define int long long后在本地就不再溢出,且将mod改为正确的1e9+7后就可以AC请问一开始的在本地会溢出,而在洛谷IDE上就不会是什么原理?
回复
共 3 条回复,欢迎继续交流。
正在加载回复...