zoukankan      html  css  js  c++  java
  • HDU 5446 Unknown Treasure (卢卡斯+CRT

    代码:

     1 #include"bits/stdc++.h"
     2 #define db double
     3 #define ll long long
     4 #define vec vector<ll>
     5 #define Mt  vector<vec>
     6 #define ci(x) scanf("%d",&x)
     7 #define cd(x) scanf("%lf",&x)
     8 #define cl(x) scanf("%lld",&x)
     9 #define pi(x) printf("%d
    ",x)
    10 #define pd(x) printf("%f
    ",x)
    11 #define pl(x) printf("%lld
    ",x)
    12 const int N   = 1e5+5;
    13 using namespace std;
    14 typedef pair<ll, ll> pll;
    15 ll F[N], Finv[N], inv[N];//F是阶乘,Finv是逆元的阶乘
    16 ll mul(ll a, ll b, ll mod) {
    17     ll ret = 0;
    18     while(b) {
    19         if(b & 1)    ret = (ret + a) % mod;
    20         a = (a + a) % mod;
    21         b >>= 1;
    22     }
    23     return ret;
    24 }
    25 void init(int mod){
    26     inv[1] = 1;
    27     for(int i = 2; i < N; i ++){
    28         inv[i] = (mod - mod / i) * 1ll * inv[mod % i] % mod;
    29     }
    30     F[0] = Finv[0] = 1;
    31     for(int i = 1; i < N; i ++){
    32         F[i] = F[i-1] * 1ll * i % mod;
    33         Finv[i] = Finv[i-1] * 1ll* inv[i] % mod;
    34     }
    35 }
    36 ll C(ll n, ll m,int mod){    //C(n, m)就是C(n, m)
    37     if(m < 0 || m > n)  return 0;
    38     return F[n] * 1ll * Finv[n - m] % mod * Finv[m] % mod;
    39 }
    40 ll Lucas(ll n, ll m, int p){
    41     return m ? mul(Lucas(n/p, m/p, p),C(n%p, m%p, p),p) : 1;
    42 }
    43 ll exgcd(ll a, ll b, ll &x, ll &y)//ax+by=gcd(a,b)的整数解
    44 {
    45     ll d;
    46     //if (a == 0 && b == 0) return -1;
    47     if (b == 0)
    48     {
    49         x = 1,y = 0;
    50         return a;
    51     }
    52     d = exgcd(b, a%b, y, x);
    53     y -= a / b * x;
    54     return d;
    55 }
    56 ll INV(ll a,ll p)
    57 {
    58     ll d,x,y;
    59     d = exgcd(a,p,x,y);
    60     return d==1?(x%p+p)%p:-1;
    61 }
    62 
    63 ll china(int n, ll *a, ll *m){
    64     ll M = 1, ret = 0;
    65     for(int i = 0; i < n; i ++) M *= m[i];
    66     for(int i = 0; i < n; i ++){
    67         ll w = M / m[i];
    68         ret = (ret + mul(mul(w, INV(w, m[i]),M),a[i],M)) % M;
    69     }
    70     return (ret + M) % M;
    71 }
    72 ll n,m;
    73 int k;
    74 ll P[N],R[N];
    75 int main(){
    76     int T;
    77     scanf("%d",&T);
    78     while(T--){
    79         scanf("%lld%lld%d",&n,&m,&k);
    80         for(int i=0;i<k;i++){
    81            cl(P[i]);
    82            init((int)P[i]);
    83            R[i]=Lucas(n,m,P[i]);
    84         }
    85         ll ans=china(k,R,P);
    86         pl(ans);
    87     }
    88     return 0;
    89 }
  • 相关阅读:
    正则表达式
    DNS协议相关命令 dig
    Linux下 redsocks + iptables + socks5 实现全局代理
    Kotlin native 初心
    Kotlin 初心
    XMLHttpRequest2 实现AJAX跨域请求
    CSS、JavaScript 初心
    jQuery 初心
    java.lang.ClassNotFoundException 解决方案
    CPU 负荷过重时邮件报警
  • 原文地址:https://www.cnblogs.com/mj-liylho/p/9440827.html
Copyright © 2011-2022 走看看