Happy Equation ZOJ - 4123 (数论)

 题目链接:ZOJ - 4123 

 题目大意:给你a和p,然后问你[1,2^p]中满足那个等式的值有多少个。

具体思路:

具体的证明:https://blog.csdn.net/v5zsq/article/details/79325038

打表发现当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)(向上取整).然后再减去暴力算的那一块就好了。

AC代码:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 # define ll long long
 4 # define inf 0x3f3f3f3f
 5 const int maxn = 2e5+100;
 6 ll qsm(ll t1,ll t2,ll mod)
 7 {
 8     ll ans=1ll;
 9     while(t2)
10     {
11         if(t2&1)
12             ans=ans*t1%mod;
13         t1=t1*t1%mod;
14         t2>>=1;
15     }
16     return ans;
17 }
18 int main()
19 {
20     int T;
21     scanf("%d",&T);
22     while(T--)
23     {
24         ll a,p;
25         scanf("%lld %lld",&a,&p);
26         if(a%2!=0)
27         {
28             printf("%lld\n",1);
29             continue;
30         }
31         ll t1=(1ll<<p);
32         ll sum=0;
33         for(ll i=1; i<=p; i++)
34         {
35             if(qsm(a,i,t1)==qsm(i,a,t1))
36                 sum++;
37         }
38         ll tmp=(p/a)+(p%a==0?0:1);
39         sum=sum+(t1>>tmp)-(p>>tmp);
40         printf("%lld\n",sum);
41     }
42     return 0;
43 }

 

posted @ 2019-05-14 10:50  Let_Life_Stop  阅读(842)  评论(0编辑  收藏  举报