玄学求助
查看原帖
玄学求助
242524
JRzyh楼主2021/3/10 21:50

0分

#include<bits/stdc++.h>
using namespace std;
long long mod_mul(long long a,long long b,long long mod)
{
	long long res=1,ans=a%mod;
	while(b)
	{
		if(b&1)res=(res%mod+ans%mod)%mod;
		ans=(ans%mod+ans%mod)%mod;
		b>>=1;
	}
	return res%mod;
}
long long m;
struct mat
{
	int n,m;
	long long z[123][123];
	mat(){n=m=0;memset(z,0,sizeof(z));}
	mat(int _n,int _m){n=_n,m=_m;memset(z,0,sizeof(z));}
	long long * operator [] (int b){return (this)->z[b];}
};
const mat error(-1,-1);
mat makeI(int n){mat c;c.m=c.n=n;for(int i=1;i<=n;i++)c.z[i][i]=1;return c;}
mat operator * (const mat &a,const mat &b)
{
	if(a.m==-1||a.n==-1||b.m==-1||b.n==-1)return error;if(a.m!=b.n)return error;
	mat 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++)
		{
			for(int k=1;k<=a.m;k++)
			{
				c.z[i][j]+=mod_mul(a.z[i][k]%m,b.z[k][j]%m,m);
				c.z[i][j]%=m;
			}
		}
	}
	return c;
}
void operator *= (mat &a,const mat &b){a=a*b;}
mat ksm(mat a,long long b)
{
	if(a.m==-1||a.n==-1)return error;if(a.m!=a.n)return error;
	mat res=makeI(a.n),ans=a;
	while(b){if(b&1)res*=ans;ans*=ans;b>>=1;}
	return res;
}
long long a1,c,x,n,g;
int main()
{
	cin>>m>>a1>>c>>x>>n>>g;
	mat a(1,2);
	a[1][1]=x;a[1][2]=c;
	mat b(2,2);
	b[1][1]=a1;b[1][2]=0;
	b[2][1]=1;b[2][2]=1;
	mat x=ksm(b,n);
	x=a*x;
	cout<<x[1][1]%g<<endl; 
	return 0;
}

10分

把快速幂改了一小下

#include<bits/stdc++.h>
using namespace std;
long long mod_mul(long long a,long long b,long long mod)
{
	long long res=1,ans=a%mod;
	while(b)
	{
		if(b&1)res=(res%mod+ans%mod)%mod;
		ans=(ans%mod+ans%mod)%mod;
		b>>=1;
	}
	return res%mod;
}
long long m;
struct mat
{
	int n,m;
	long long z[123][123];
	mat(){n=m=0;memset(z,0,sizeof(z));}
	mat(int _n,int _m){n=_n,m=_m;memset(z,0,sizeof(z));}
	long long * operator [] (int b){return (this)->z[b];}
};
const mat error(-1,-1);
mat makeI(int n){mat c;c.m=c.n=n;for(int i=1;i<=n;i++)c.z[i][i]=1;return c;}
mat operator * (const mat &a,const mat &b)
{
	if(a.m==-1||a.n==-1||b.m==-1||b.n==-1)return error;if(a.m!=b.n)return error;
	mat 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++)
		{
			for(int k=1;k<=a.m;k++)
			{
				c.z[i][j]+=mod_mul(a.z[i][k]%m,b.z[k][j]%m,m);
				c.z[i][j]%=m;
			}
		}
	}
	return c;
}
void operator *= (mat &a,const mat &b){a=a*b;}
mat ksm(mat xc,mat a,long long b)
{
	if(a.m!=a.n)return error;
	mat res=xc,ans=a;
	while(b)
	{
		if(b&1)res=res*ans;
		ans=ans*ans;
		b>>=1;
	}
	return res;
}
long long a1,c,x,n,g;
int main()
{
	cin>>m>>a1>>c>>x>>n>>g;
	mat a(1,2);
	a[1][1]=x;a[1][2]=c;
	mat b(2,2);
	b[1][1]=a1;b[1][2]=0;
	b[2][1]=1;b[2][2]=1;
	mat x=ksm(a,b,n);
	cout<<x[1][1]%g<<endl; 
	return 0;
}

按道理说不会有差别啊。

还有咋得满分啊?

2021/3/10 21:50
加载中...