【jzoj4264】【tty妹子的函数】

来源:互联网 发布:卖家开通淘宝客的条件 编辑:程序博客网 时间:2024/05/01 17:26

题目大意

对于给定的函数这里写图片描述,求这个函数将会经过多少个整点。

解题思路

观察可知,Ans=NX=1(X(XA)==0(%M))=NX=1(X2==XA(%M))

令D=Gcd(X,M),X=X’D,M=M’D。Ans=D|MN/DX=1(XX==XA(%M))=D|MN/DX=1(XX+YM==XA)

由于Gcd(X’,M’)==1,所以X’是Y的约数,Ans=D|MN/DX=1(X+YM==A)=D|MN/DX=1(X==A(%M))

N/DX=1(X==A(%M))=N/DX=1(DX+MY==A)可以用Exgcd求出特解,再计算通解的个数,由于A是质数所以Gcd(D,M’)==1才能算贡献。

code

#include<cmath>#include<cstdio>#include<cstring>#include<algorithm>#define LF double#define LL long long#define min(a,b) ((a<b)?a:b)#define max(a,b) ((a>b)?a:b)#define fo(i,j,k) for(int i=j;i<=k;i++)#define fd(i,j,k) for(int i=j;i>=k;i--)using namespace std;int const MxN=1e7;LL N,M,A;LL Exgcd(LL A,LL &X,LL B,LL &Y){    if(!B){X=1;Y=0;return A;}    LL Gcd=Exgcd(B,Y,A%B,X);    Y-=A/B*X;    return Gcd;}LL Calc(LL D){    LL X,Y,Gcd=Exgcd(D,X,M/D,Y),Mo=M/D/Gcd;    if(Gcd!=1)return 0;    X=(X%Mo+Mo)%Mo;    X=X*A%Mo;if(!X)X=Mo;    if(N/D<X)return 0;    return (N/D-X)/Mo+1;}int main(){    freopen("d.in","r",stdin);    freopen("d.out","w",stdout);    int T;scanf("%d",&T);    fo(cas,1,T){        scanf("%lld%lld%lld",&N,&M,&A);        LL Ans=0;LL Mx=sqrt(M);        fo(d,1,Mx)if(M%d==0){            Ans+=Calc(d);            if(d*d!=M)Ans+=Calc(M/d);        }        printf("%lld\n",Ans);    }    return 0;}
0 0
原创粉丝点击