题目描述:
题目大意:
给定a,n(a≤
样例输入
2
2 3
2 2
样例输出
3
2
题目分析
找规律加数学推理。首先分两种情况:
a为奇数:如果你打了个暴力,然后打打表什么的就可以发现答案恒为1。证明如下:
1、a为奇数,b也一定为奇数,否则,
2、再证明
①奇数平方模8余1(你可以写成
②奇数四次方模16余1,所以有
③同理我们可得
3、于是归纳得出满足要求的a,b满足条件
a为偶数:
1、同理b也一定为偶数。
2、若n≤b,则
3、若
PS: 证明
附代码
#include<iostream>
#include<cstring>
#include<string>
#include<cstdlib>
#include<cstdio>
#include<ctime>
#include<cmath>
#include<cctype>
#include<iomanip>
#include<algorithm>
#include<queue>
using namespace std;
int mi[50],t,n,a,ans,x;
int readint()
{
char ch;int i=0,f=1;
for(ch=getchar();(ch<'0'||ch>'9')&&ch!='-';ch=getchar());
if(ch=='-') {ch=getchar();f=-1;}
for(;ch>='0'&&ch<='9';ch=getchar()) i=(i<<3)+(i<<1)+ch-'0';
return i*f;
}
int ksm(int x,int y)
{
int ret=1;
for(;y;y/=2,x=(long long)(x*x)%mi[n])
if(y&1) ret=(long long)(ret*x)%mi[n];
return ret;
}
int main()
{
//freopen("math.in","r",stdin);
//freopen("math.out","w",stdout);
mi[0]=1;
for(int i=1;i<=30;i++)//预处理2的次幂
mi[i]=(mi[i-1]<<1);
t=readint();
while(t--)
{
a=readint();n=readint();
if(a%2==1) printf("1\n");
else
{
ans=0;
x=(n+a-1)/a;//相当于向上取整
ans+=mi[n]/mi[x];
ans-=n/mi[x];
for(int i=2;i<=n;i+=2)
if(ksm(a,i)==ksm(i,a)) ans++;
printf("%d\n",ans);
}
}
return 0;
}