Happy Equation
题意:
给出的那个等式,问有多少个x满足等式,就酱;
参考了几篇博客:
(感觉这个比较好理解)
https://blog.youkuaiyun.com/v5zsq/article/details/79325038
https://www.cnblogs.com/albert-biu/p/10864882.html?tdsourcetag=s_pcqq_aiomsg
打表发现当a为奇数的时候答案为1
#include <iostream>
#include <algorithm>
#include <string>
#include <map>
#include <cstring>
#include <cmath>
#include <queue>
#include <cstdio>
#include <vector>
#include <set>
#include <stack>
using namespace std;
typedef long long ll;
const int N = 1e6+10;
const int INF=0x3f3f3f3f;
const ll LINF=0x3f3f3f3f3f3f3f3f;
const int MOD=1e9+7;
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define Abs(x) ((x)>=0?(x):-(x))
ll mod;
ll qpow(ll base,ll p){
ll ans=1;
while(p){
if(p&1) ans=ans*base%mod;//这个地方需要注意取余
p>>=1;
base=base*base%mod;
}
return ans;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif // ONLINE_JUDGE
int T;
scanf("%d",&T);
while(T--){ll a,p;
scanf("%lld%lld",&a,&p);
int cnt=0;
if(a&1){printf("1\n");continue;}
ll ans=0;
mod=pow(2,p);
for(int x=1;x<=p;x++)
if(qpow(a,x)==qpow(x,a))
ans++;
ll m=p/a;
if(p%a) m++;//上取整
ans+=mod/qpow(2,m)-(p)/qpow(2,m);
printf("%lld\n",ans) ;
}
return 0;
}