919E - Congruence Equation(费马小定理)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lvmaooi/article/details/82458626

919E - Congruence Equation

题目大意:

给定 a b x p
1 n x 且满足 n a n = b ( m o d p ) n 有多少个?













解:

如何学习数学?
要跪了。
费马小定理的一道好题。推一波式子就可以for循环完美解决:
发现 n 作为次数特别大,这个不好算。其实 n 作为系数还可以处理,这里我们为了使用费马小定理把 n 拆分成 i ( p 1 ) + j
n a n = b ( m o d p )
[ i ( p 1 ) + j ] a j = b ( m o d p )
i p i + j = b a j ( m o d p )
p 的倍数部分去掉
i = j b a j ( m o d p )

我们惊奇地发现我们把 i , j 分开了,而且 j 是小于 p 的(一脸可做的样子)。
于是我们想到枚举 j 然后可以求出 i % p 的值,算出在满足条件的 i 有多少。

需要注意的是 j 应该从0枚举到p-1
同时如果有 i =0&& j =1应该去掉。

code:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;

long long a,b,p,x;
long long n;

long long qui(long long e,long long c){
    long long ret=1;
    while(c!=0){
        if((c&1)==1) ret=ret*e%p;
        e=e*e%p;
        c=c>>1;
    }
    return ret;
}

int main()
{
    cin>>a>>b>>p>>x;
    for(long long j=0;j<min(p-1,x+1);j++){
        long long w=qui(qui(a,j),p-2);
        w=(j-b*w)%p;w=(w+p)%p;
        long long u=(x-j)/(p-1);
        if(u>=w) n+=(u-w)/p+1;
        if(j==0&&w==0) n--;
    }
    cout<<n;
}

猜你喜欢

转载自blog.csdn.net/lvmaooi/article/details/82458626