1. 程式人生 > >919E - Congruence Equation(費馬小定理)

919E - Congruence Equation(費馬小定理)

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;
}