题目描述:
题意:给定n,a,其中令2^n=m,现求区间[1,m]内有多少个b满足,a^b%m=b^a%m。
首先打表的话可以很容易找到一个规律:a为奇数时,答案肯定为1,这个规律很容易看出就不证了(其实我也不会证 T_T),详细解释一下a为偶数时怎么算,m一定为偶数,所以a^b%m的结果也为偶数,那么b^a%m的结果也必须为偶数,所以b必须为偶数,a既然为偶数那么一定可以写成2*x,所以a^b=2^b*x^b,又m=2^n显然可以发现如果b>=n那么a^b%m一定为0,这个时候就可以分类讨论,由于题目数据中n非常小,所以b<n时直接暴力求解,那么b>=n时这个已经确定a^b%m=0所以我们需要b^a%m同样为0,b为偶数,那么b一定可以表示为2^x*y,那么b^a=2^ax*y^a,我们先令y取得最小1,b^a=2^ax,b^a(2^ax)%m(2^n)=0,所以ax>=n,x>=n/a(注意这里n/a应该向上取整),所以我们就这样找到最小满足条件的x,然后在求出m以内2^x的倍数即可(注意把n以内的答案减去,因为n以内的答案暴力时求过一遍)。还有这题迷之爆int。
AC代码:
#include<io