919E - Congruence Equation
题目大意:
给定
,
,
,
求
且满足
的
有多少个?
解:
如何学习数学?
要跪了。
费马小定理的一道好题。推一波式子就可以for循环完美解决:
发现
作为次数特别大,这个不好算。其实
作为系数还可以处理,这里我们为了使用费马小定理把
拆分成
把
的倍数部分去掉
我们惊奇地发现我们把
分开了,而且
是小于
的(一脸可做的样子)。
于是我们想到枚举
然后可以求出
%
的值,算出在满足条件的
有多少。
需要注意的是
应该从0枚举到p-1
同时如果有
=0&&
=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;
}