码迷,mamicode.com
首页 > 其他好文 > 详细

2020.09.27省赛模拟补题

时间:2020-10-06 20:47:21      阅读:25      评论:0      收藏:0      [点我收藏+]

标签:ace   namespace   mod   app   set   题意   its   ++   int   

ZOJ-4123 Happy Equation

链接: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;
}

 

2020.09.27省赛模拟补题

标签:ace   namespace   mod   app   set   题意   its   ++   int   

原文地址:https://www.cnblogs.com/xihujunzili/p/13772994.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!