您的位置:首页 > 其它

HDU 5895 Mathematician QSC

2016-10-07 01:28 369 查看
题目地址

欧拉函数+矩阵快速幂

#include<cstdio>
#include<algorithm>
#include<string.h>
#include<queue>
#define LL long long
using namespace std;
const int Nmax=10;
LL n,y,x,s,tmp;
int mod;
int oula_mod;

struct Matrix
{
int n,m;
long long map[Nmax][Nmax];
Matrix(int x,int y)
{
n=x;m=y;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
map[i][j]=0;
}
Matrix operator * (const Matrix b)
{
Matrix c(n,b.m);
if(m==b.n)
{
for(int i=1;i<=c.n;i++)
for(int j=1;j<=c.m;j++)
for(int k=1;k<=m;k++)
c.map[i][j]=(c.map[i][j]+(map[i][k]*b.map[k][j])%oula_mod)%oula_mod;
return c;
}
printf("error!!!!!!!!!!!!!!\n");
}
};

int oula(int n)
{
int ret=1,i;
for(i=2;i*i<=n;i++)
{
if(n%i==0)
{
n/=i,ret*=i-1;
while(n%i==0) n/=i,ret*=i;
}
}
if(n>1) ret*=n-1;
return ret;
}

Matrix get(long long n)
{
Matrix base(4,4);
base.map[1][1]=1;base.map[1][2]=1;base.map[1][3]=0;base.map[1][4]=0;
base.map[2][1]=0;base.map[2][2]=4;base.map[2][3]=1;base.map[2][4]=4;
base.map[3][1]=0;base.map[3][2]=1;base.map[3][3]=0;base.map[3][4]=0;
base.map[4][1]=0;base.map[4][2]=2;base.map[4][3]=0;base.map[4][4]=1;
Matrix ans(4,4);
for(int i=1;i<=ans.n;i++)
ans.map[i][i]=1;

while(n>0)
{
if(n & 1)
ans=ans*base;
base=base*base;
n>>=1;
}

return ans;
}

long long get_ans(long long times)
{
long long ans=1;
long long base=x;
while(times>0)
{
if(times & 1)
ans=(ans*base)%mod;
base=(base*base)%mod;
times>>=1;
}
return ans;
}

int main()
{

int t;
scanf("%d",&t);
while(t--)
{
scanf("%lld%lld%lld%lld",&n,&y,&x,&s);
mod=s+1;
oula_mod=oula(mod);
//printf("oula_mod:%d\n",oula_mod);
Matrix base(4,1);
base.map[1][1]=0;
base.map[2][1]=1;
base.map[3][1]=0;
base.map[4][1]=0;
Matrix ans=get(n*y)*base;
long long mi=ans.map[1][1]+oula_mod;
//printf("mi:%lld\n",mi );
//continue;
printf("%lld\n",get_ans(mi));
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: