zoukankan      html  css  js  c++  java
  • HZOI20190823 C magic

    数论板子合集。。。

    我们要求:

    $N^{sumlimits_{i=1}^{N}[gcd(i,N)==1]C_{n}^{i}}mod p$

    其中p为54184622,是个合数

    指数是组合数,不能用快速幂,只能mod phi(p),phi(p)=p-1,而p-1不是质数,要用crt合并

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<queue>
    #include<stack>
    #include<cmath>
    #include<algorithm>
    #define mod 54184622
    #define int long long
    #define MAXN 1000005
    using namespace std;
    int n,g,a[7],prime[7]={0,2,3,5,7,129011};
    int fac[7][MAXN],ans;
    int q_pow(int a,int b,int p){
        int res=1;
        while(b){
            if(b&1) res=(res*a)%p;
            a=(a*a)%p;
            b>>=1;
        }
        return res%p;
    }
    int gcd(int a,int b){
    	return b==0?a:gcd(b,a%b);
    }
    int C(int n,int m,int p){
    	if(n==m) return 1;
    	if(m>n) return 0;
    	return fac[p][n]*q_pow(fac[p][m]*fac[p][n-m]%prime[p],prime[p]-2,prime[p]);
    }
    int lucas(int n,int m,int p){
    	if(m==0) return 1;
    	return lucas(n/prime[p],m/prime[p],p)%mod*C(n%prime[p],m%prime[p],p)%prime[p];
    }
    int crt(){
    	int p=27092310,res=0;
        for(int i=1;i<=5;i++)
            res=(res+p/prime[i]*a[i]%p*q_pow(p/prime[i],prime[i]-2,prime[i])%p)%p;
        return res;
    }
    signed main(){
        scanf("%lld %lld",&n,&g);
        for(int i=1;i<=5;i++){
            fac[i][0]=1;
            for(int j=1;j<=prime[i];j++)
                 fac[i][j]=fac[i][j-1]*j%prime[i];
        }
        for(int i=1;i<=min(n,g);i++){
            if(gcd(i,n)!=1) continue;
            for(int j=1;j<=5;j++){
                a[j]=(a[j]+lucas(g,i,j))%prime[j];
    		}
    	}
        ans=crt();
        printf("%lld
    ",q_pow(n,ans,mod));
        return 0;
    }
    
  • 相关阅读:
    docker基础概念
    面试题
    python总结【来自Runoob】
    如何实现在分组的情况下,以另一个时间字段查询出结果?
    Java FIle类和IO流
    HTML5 基础知识(1)——基本标签
    数据库个人笔记(3) -- 基础篇
    数据库个人笔记(2) -- 基础篇
    数据库个人笔记(1)-- 基础篇
    python 基础学习笔记(8)--装饰器
  • 原文地址:https://www.cnblogs.com/Juve/p/11418911.html
Copyright © 2011-2022 走看看