hdu 5895

#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)  //&#190;&#216;&#213;ó3&#203;·¨
{
    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) //&#191;ì&#203;ù&#195;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;
}
發佈了44 篇原創文章 · 獲贊 3 · 訪問量 7976
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章