玄关
查看原帖
玄关
381643
Stairs_upon_temple楼主2024/9/14 16:34
/*
g++ -o2 SP10050.cpp -o c -std=c++14
.\c

*/

#include<cstdio>

using namespace std;
typedef long long ll;
typedef __int128 in;

const ll N=5e3+100;
const ll MOD=1e9;
ll flg;

char *p1,*p2;
char buf[N];

#define nc() getchar()
// #define nc() (p1==p2 && (p2=(p1=buf)+fread(buf,1,N,stdin),p1==p2)?EOF:*p1++)

void read(ll &x){
    ll sum=0;
    ll f=1;
    char ch=nc();
    while(ch<48 || ch>57){
        ch=nc();
    }
    while(ch>=48 && ch<=57){
        sum=(sum<<1)+(sum<<3)+ch-48;
        ch=nc();
    }
    x=sum;
    return ;
}

void write(ll x,ll idx){
    if(idx==10)return ;
    write(x/10,idx+1);
	putchar(x%10+'0');
}

ll max(ll a,ll b){return a>b?a:b;}
ll min(ll a,ll b){return a<b?a:b;}

in pow(in a,in b,ll p){
    in sum=1;
    while(b){
        if(b&1){
            sum=sum*a;
            sum=sum>=p?sum%p+p:sum;
        }
        a=a*a;
        a=a>=p?a%p+p:a;
        b>>=1;
    }
    return sum%p;
}

ll ask(ll m){
    ll sum=m;
    if(m==1)return 1;
    for(ll i=2;i*i<=m;i++){
        if(m%i==0){
            sum=sum/i*(i-1);
            while(m%i==0)m/=i;
        }
    }
    return m>1?sum/m*(m-1):sum;
}

bool check(ll a,ll b){
    if(b>=5)return 1;
    else if(b==4){
        if(a>2)return 1;
        return 0;
    }
    else if(b==3){
        if(a>=3)return 1;
        return 0;
    }
    else if(b==2){
        if(a>=10)return 1;
        return 0;
    }
    return 0;
}

ll t;
ll a,b;
ll mul[N];
ll phi[N];

void init(){
    phi[1]=MOD;
    for(ll i=2;i<=min(b,32)+1000;i++){
        phi[i]=ask(phi[i-1]);
    }
    return ;
}

int main(){
    // read(t);
    scanf("%lld",&t);
    while(t--){
        // read(a);
        // read(b);
        scanf("%lld%lld",&a,&b);
        flg=check(a,b);
        if(a==1){
            printf("1\n");
            continue;
        }
        if(a==0){
            if(b%2==0)printf("1\n");
            else printf("0\n");
            continue;
        }
        if(b==0){
            printf("1\n");
            continue;
        }
        if(b==1){
            printf("%lld\n",a);
            continue;
        }
        // for(ll i=1;i<=min(b,32);i++)mul[i]=a;
        init();
        in sum=1;
        for(ll i=min(b,32);i>=1;i--){
            if(phi[i]==1){
                sum=1;
                continue;
            }
            sum=pow(a,sum,phi[i]);
            if(sum==1)sum+=phi[i];
            if(sum==0)sum+=phi[i];
        }
        ll s=sum%MOD;
        // print(s);
        if(flg)printf("...%09lld\n",s);
        else printf("%lld\n",s);
    }
    return 0;
}
2024/9/14 16:34
加载中...