模数灵异事件
  • 板块学术版
  • 楼主wo_hen_la
  • 当前回复6
  • 已保存回复7
  • 发布时间2024/7/8 11:10
  • 上次更新2024/7/8 12:34:11
查看原帖
模数灵异事件
794701
wo_hen_la楼主2024/7/8 11:10

当n=2,当P设为(int)1e9+7时输出38,当P设为1000000007时输出10。

这是为什么?

#include <bits/stdc++.h>
using namespace std;

#define int long long
#define P (int)1e9+7//1000000007

int n;
int ans[3][3],a[3][3],c[3][3];
void mul(int a1[3][3],int a2[3][3],bool f)
{
	memset(c,0,sizeof(c));
	for(int i=1;i<=2;i++){
		for(int j=1;j<=2;j++){
			for(int k=1;k<=2;k++) c[i][j]=(c[i][j]+a1[i][k]*a2[k][j])%P;
		}
	}
	if(!f) memcpy(a,c,sizeof(c));
	else memcpy(ans,c,sizeof(c));
}
main()
{
	ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);
	cin>>n;
	a[1][1]=a[2][2]=3;
	a[1][2]=a[2][1]=1;
	ans[1][1]=ans[2][2]=1;
	while(n){
		if(n&1) mul(ans,a,1);
		mul(a,a,0);
		n>>=1;
	}
	cout<<ans[1][1];
	return 0;
}
2024/7/8 11:10
加载中...