等比数列求和取余

    xiaoxiao2023-11-23  187

    一、二分+快速幂

    #include<bits/stdc++.h> #define lom long long using namespace std; lom quick(lom a,lom b,lom c)//quick mod { lom ans=1; a%=c; while(b) { if(b&1) ans=ans*a%c; a=a*a%c; b>>=1; } return ans%c; } lom sum(lom a,lom b,lom p) {// get the sum of the sequence of equal ratio numbers by bisection if(b==0) return 1; if(a==0) return 0; if(b&1) return ((1+quick(a,b/2+1,p)) * sum(a,b/2,p))%p; else return ((1+quick(a,b/2+1,p)) * sum(a,b/2-1,p) + quick(a,b/2,p))%p; } int main() { lom n,p,q; while(cin>>q>>n>>p) cout<<(sum(q,n,p)-1)%p<<endl; return 0; }

     

    二、通项公式+逆元+快速幂

    逆元:https://blog.csdn.net/qq_41431457/article/details/89813606

    a/b(mod p) == a*b^(p-2) (mod p)

    (1)如果 与p互质,直接逆元快速幂(默认 a1==q)

    #include<bits/stdc++.h> #define lom long long using namespace std; lom quick(lom a,lom b,lom c)//快速幂取模 { lom ans=1; a%=c; while(b) { if(b&1) ans=ans*a%c; a=a*a%c; b>>=1; } return ans%c; } lom divi(lom a,lom b,lom p) { b=quick(b,p-2,p); //b的逆元 return a*b%p; } int main() { lom n,p,q; while(cin>>q>>n>>p) { lom t=q*(quick(q,n,p)-1); cout<<divi(t,q-1,p); } return 0; }

    (2)如果不互质 变换模值 (A/B)%P == (A%(P*B))/B%P

     

     

    最新回复(0)