题解好像还没有C++矩阵题解吧
查看原帖
题解好像还没有C++矩阵题解吧
1313559
cangjunyuehan楼主2024/10/16 13:39

如题

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll N=5e7+10,mod=9901;
ll m,n,num[N],sum=1;
bool su[N];
queue<ll> q;
struct matrix{
	ll m[2][2];
};
matrix operator * (const matrix &a,const matrix &b){
	matrix c;
	memset(c.m,0,sizeof(c.m));
	for(int i=0;i<2;++i)
	for(int j=0;j<2;++j)
	for(int k=0;k<2;++k)
	c.m[i][j]=(c.m[i][j]+a.m[i][k]*b.m[k][j])%mod;
	return c;
}
ll ksm(ll s,ll t){
	matrix ans,a;
	a.m[0][0]=s,a.m[1][0]=s,a.m[1][1]=1,a.m[0][1]=0;
	ans.m[0][0]=1,ans.m[0][1]=0,ans.m[1][1]=1,ans.m[1][0]=0;
	while(t>0){
		if(t&1) ans=ans*a;
		a=a*a;
		t>>=1;
	}
	return ans.m[1][0];
}
void _init(){
	su[1]=true;
	for(int i=2;i<=sqrt(m);++i)
	if(!su[i])
	for(int j=2;j<=sqrt(m);++j)
		su[i*j]=true;
	ll i=1;
	while(m^1){
		while(su[i]) ++i;
		if(!(m%i)){
			if(!num[i]) q.push(i);
			++num[i];
			m/=i;
		}
		else ++i;
	}
}
int main(){
	matrix b;
	scanf("%ld%ld",&m,&n);
	_init();
	while(!q.empty()){
		ll i=q.front();
		q.pop();
		sum*=(ksm(i,n*num[i])+1);
		sum%=mod;
	}
	printf("%ld",sum);
	return 0;
}
2024/10/16 13:39
加载中...