标签:ace namespace mod app set 题意 its ++ int
链接:https://zoj.pintia.cn/problem-sets/91827364500/problems/91827370518
题意:求x∈{1,2,.....,2^p}使得a^x≡x^a(mod 2^p),满足的x个数为多少个。
分析:
打表发现当a为奇数的时候答案为1.当a为偶数的时候,x也必须为偶数。
然后我们将a分解为2*t。然后a^x就等于 (2^x)*(t^x).当x大于p的时候,此时取模后一定为0。对于所以在x属于[0,p]这段区间暴力算。
然后我们将b分解为(2^k)*t.然后b^x就等于 (2^(k*x)) *(t^x).然后对于k*x>p的时候,我们可以直接算出这段区间中满足情况的x的取值有多少x>(p/k)(向上取整).然后再减去暴力算的那一块就好了。
代码
#include<bits/stdc++.h> using namespace std; # define ll long long # define inf 0x3f3f3f3f const int maxn = 2e5+100; ll qsm(ll t1,ll t2,ll mod) { ll ans=1ll; while(t2) { if(t2&1) ans=ans*t1%mod; t1=t1*t1%mod; t2>>=1; } return ans; } int main() { int T; scanf("%d",&T); while(T--) { ll a,p; scanf("%lld %lld",&a,&p); if(a%2!=0) { printf("%lld\n",1); continue; } ll t1=(1ll<<p); ll sum=0; for(ll i=1; i<=p; i++) { if(qsm(a,i,t1)==qsm(i,a,t1)) sum++; } ll tmp=(p/a)+(p%a==0?0:1); sum=sum+(t1>>tmp)-(p>>tmp); printf("%lld\n",sum); } return 0; }
标签:ace namespace mod app set 题意 its ++ int
原文地址:https://www.cnblogs.com/xihujunzili/p/13772994.html