社区讨论

神仙溢出未解之谜

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 条回复,欢迎继续交流。

正在加载回复...