思路:
列举几个就可以发现规律:
n=1 4^1-1
n=2 4^2-1
n=3 4^3-1
或者可以这么想,比如n=3时,盒子里有:1 1 3 3四个物品,对于每个物品有“取”或者“不取”两种状态,所以,一共有2^4-1种取法(减1是因为不能全不取),然后对于每种取法,都能保证取出来的数之和是在[1,8]之间的,所以,对应的是2^(2n)-1种取法,也就是4^n-1种
欧拉降幂公式:
a^b(mod p)=(a^(b mod f(p)+f(p)))%p
f(p)是p对应的欧拉函数值
代码如下:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string>
#include<cstring>
#include<queue>
#include<stack>
#include<cmath>
#include<set>
#include<map>
using namespace std;
#define ll long long
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
typedef pair<int,int>P;
const int INF=0x3f3f3f3f;
const int N=32010;
ll n,p;
ll euler(ll n){
ll res=n;
for(ll i=2;i*i<=n;i++){
if(n%i==0){
res=res/i*(i-1);
for(;n%i==0;n/=i);
}
}
if(n!=1)res=res/n*(n-1);
return res;
}
ll ksm(ll a,ll b){
ll res=1;
while(b){
if(b&1)res=res*a%p;
b>>=1;
a=a*a%p;
}
return res%p;
}
int main(){
int t;
string s;
scanf("%d",&t);
while(t--){
n=0;
cin>>s>>p;
int len=s.length();
ll phi=euler(p);
for(int i=0;i<len;i++){
n=(n*10+s[i]-'0')%phi;
}
n+=phi;
ll res=(ksm(4,n)-1+p)%p;
printf("%lld\n",res);
}
}