您的位置:首页 > 其它

hdu 5895

2017-03-20 12:42 190 查看
#include <iostream>
#include <cstdio>
#include <string.h>
#include <algorithm>
#include <map>
#include <queue>
#include <stdlib.h>
#include <cmath>
#include <vector>
#include <stack>

#define clr(x) memset(x,0,sizeof(x))
#define clr2(x) memset(x,INF,sizeof(x))
#define clr3(x) memset(x,-INF,sizeof(x))
#define INF 0x3f3f3f3f
#define MAXN 100010
#define MAXM 100010
#define pb(x) push_back(x)
#define ll long long
#define ull unsigned long long
#define MAXS 100000010
using namespace std;

struct Martix
{
ll a[3][3];
};

ll p;
ll mul2(ll y, ll cnt);
Martix mul(Martix a,Martix b)  //¾ØÕó3Ë·¨
{
Martix c;
clr(c.a);
for (int i=0;i<3;i++)
for (int j=0;j<3;j++)
for (int k=0;k<3;k++)
{
c.a[i][j] += ( a.a[i][k]*b.a[k][j] ) % p;
c.a[i][j] %= p;
}
return c;
}

Martix solve_pow(Martix a,ll t) //¿ìËùÃY
{
Martix b;
clr(b.a);
for(int i=0;i<3;i++)
b.a[i][i]=1;
while(t>0)
{
if(t & 1) b=mul(b,a);
a=mul(a,a);
t >>= 1;
}

return b;
}

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

ll quickmod(ll a,ll b,ll m)
{
ll ans = 1;
while(b)
{
if(b&1)
{
ans = (ans*a)%m;
b--;
}
b/=2;
a = a*a%m;
}
return ans;
}
ll n,y,x,s;
void solve()
{
scanf("%lld%lld%lld%lld",&n,&y,&x,&s);
Martix base,ans;
base.a[0][0]=5;
base.a[0][1]=1;
base.a[0][2]=0;
base.a[1][0]=5;
base.a[1][1]=0;
base.a[1][2]=1;
base.a[2][0]=-1;
base.a[2][1]=0;
base.a[2][2]=0;
p=euler(s+1);

ans=solve_pow(base,n*y-1);
ll ex=ans.a[0][0];
ex+=p;
ll res=quickmod(x,ex,s+1);
printf("%lld\n",res);
}
int main()
{
int T;
scanf("%d",&T);
while (T--)
solve();
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: