• 古代猪文


    古代猪文

    # 题意

    给定$n$,$q$,求$q^{Sigma operatorname{din} C_{n}^{d}} mod p$,$p=999911659$

    $1 leqslant n, q leq 10^{9}$

    # 题解

    就是对$n$的每一个正约数$d$,求$C_{n}^{d}$,因为$1 leqslant n, q leq 10^{9}$,所以不会有p的倍数,

    所以只有$q=p$的时候原式才为$0$,所以当$q!=p$时,欧拉降幂$q^{Sigma_{d m} c_{n}^{d}} equiv q^{Sigma_{d m} C_{n}^{d} \% p-1}(mod p)$

    降幂后$p$非质数用$ExLucas$即可,将$p-1$分解质因数后为$2$、$3$、$4679$、$35617$,对于每个质因数,预处理所有阶乘,

    每次$Lucas$的复杂度是$Oleft(log _{p} N imes p  imes log p ight)$

     1 #include <bits/stdc++.h>
     2 #define ll long long
     3 using namespace std;
     4 const int mod=999911658;
     5 ll n,q;
     6 ll a[5],b[5]={0,2,3,4679,35617};
     7 ll v[50010];
     8 void init(ll p){
     9     v[0]=1;
    10     for(ll i=1;i<=p;i++){
    11         v[i]=v[i-1]*i%p;
    12     }
    13 }
    14 ll qmi(ll a,ll b,ll p){
    15     ll res=1;
    16     while(b){
    17         if(b&1) res=res*a%p;
    18         a=a*a%p;
    19         b>>=1;
    20     }
    21     return res;
    22 }
    23 ll exgcd(ll a,ll b,ll &x,ll &y){
    24     if(!b){
    25         x=1,y=0;
    26         return a;
    27     }
    28     ll d=exgcd(b,a%b,y,x);
    29     y-=(a/b)*x;
    30     return d;
    31 }
    32 vector<ll> get_divisor(ll n){
    33     vector<ll>res;
    34     for(ll d =1 ;d<=n/d;d++){
    35         if(n%d==0){
    36             res.push_back(d);
    37             if(d*d!=n)
    38                 res.push_back(n/d);
    39         }
    40     }
    41     sort(res.begin(),res.end());
    42     return res;
    43 }
    44 ll CRT(){
    45     ll M=1;
    46     for(int i=1;i<=4;i++){
    47         M*=b[i];
    48     }
    49     ll res=0;
    50     for(int i=1;i<=4;i++){
    51         ll x,y;
    52         ll tmp=M/b[i];
    53         exgcd(tmp,b[i],x,y);
    54         res=(res+tmp*x*a[i])%M;
    55     }
    56     return ((res+M)%M)%M;
    57 }
    58 ll C(ll n, ll m, ll p){
    59     if(n<m) return 0;if(!n) return 1;
    60     return v[n] * qmi(v[m],p-2,p) % p * qmi(v[n-m],p-2,p)%p;
    61 }
    62 ll lucas(ll n,ll m,ll p){
    63     if(n<m) return 0;if(!n) return 1;
    64     if(n<p&&m<p) return C(n,m,p);
    65     return (ll)C(n%p,m%p,p)*lucas(n/p,m/p,p)%p;
    66 }
    67 int main(){
    68     cin>>n>>q;
    69     if(q==mod+1) {
    70         puts("0");return 0;
    71     }
    72     auto d=get_divisor(n);
    73     for(int i=1;i<=4;i++){
    74         init(b[i]);
    75         for(int j=0;j<d.size();j++){
    76             a[i]=(a[i]+lucas(n,d[j],b[i]))%b[i];
    77         }
    78     }
    79     ll ans=CRT();
    80     cout<<qmi(q,ans,mod+1)<<endl;
    81 }
  • 相关阅读:
    Open diary(每天更新)
    独立博客与秘密基地,以及对UI设计中拟物态的怀念
    如何在宝塔面板里设置脚本定时恢复数据库
    LaTex公式语法教程及手册(附emlogpro公式显示插件katex说明)
    关于梦的冷知识
    PTui又加全景图 佳田未来城 of 安阳
    原生js 以ajax(post)的方式传json至php,并让php解析为数组
    Python面向对象——
    Python中的模块、常用模块——12
    Python中的装饰器——11
  • 原文地址:https://www.cnblogs.com/hhyx/p/12741025.html
Copyright © 2020-2023  润新知