首页 > 其他分享 >大非质数取模算组合数板子

大非质数取模算组合数板子

时间:2023-11-12 13:11:37浏览次数:26  
标签:phi int 大非 质数 取模算 num fac ll mod

const int N=1e5+10,M=13;
int n,mod,l,r;
ll ans,p[M],br[M],phi;
inline ll ksm(ll a,ll b){
	ll d=1;
	while(b){
		if(b&1) d=d*a%mod;
		a=a*a%mod;
		b>>=1;
	}
	return d;
}
namespace big_mod{
	struct num{
		ll x,r[M];
	}fac[N],I,B;
	inline num operator*(num a,num b){
		num c=I;
		for(int i=1;i<=p[0];++i) c.r[i]=a.r[i]+b.r[i];
		c.x=a.x*b.x%mod;
		return c;
	}
	inline num operator/(num a,num b){
		num c;
		for(int i=1;i<=p[0];++i) c.r[i]=a.r[i]-b.r[i];
		c.x=a.x*ksm(b.x,phi-1)%mod;
		return c;
	}
	inline num cng(ll y){
		num c=I;
		for(int i=1;i<=p[0]&&y;++i){
			while(y%p[i]==0) ++c.r[i],y/=p[i];
		}
		c.x=y;
		return c;
	}
	inline ll rec(num a){
		ll y=a.x;
		for(int i=1;i<=p[0];++i){
			y=y*ksm(p[i],a.r[i])%mod;
		}
		return y;
	}
	inline void init(){
		ll x=mod;
		phi=mod;
		for(ll i=2;i*i<=x;++i){
			if(x%i==0){
				phi=phi/i*(i-1);
				p[++p[0]]=i;
				while(x%i==0) ++br[p[0]],x/=i;
			}
		}
		if(x>1) p[++p[0]]=x,br[p[0]]=1,phi=phi/x*(x-1);
		I.x=1;
		B.x=0;
		for(int i=1;i<=p[0];++i) I.r[i]=0;
		fac[0]=I;
		for(ll i=1;i<=n;++i) fac[i]=fac[i-1]*cng(i);
	}
	inline num C(int n,int m){
		if(m<0||(m>>=1)>n) return B;
		return (fac[n]/fac[m])/fac[n-m];
	}
}

标签:phi,int,大非,质数,取模算,num,fac,ll,mod
From: https://www.cnblogs.com/mRXxy0o0/p/17827053.html

相关文章

  • 204. 计数质数(中)
    目录题目法一、暴力法法二、埃拉托斯特尼筛法(SieveofEratosthenes)法三、线性筛法题目给定整数n,返回所有小于非负整数n的质数的数量示例1:输入:n=10输出:4解释:小于10的质数一共有4个,它们是2,3,5,7。示例2:输入:n=0输出:0示例3:输入:n=1输出:0......
  • 2023-11-08:用go语言,字符串哈希原理和实现 比如p = 233, 也就是课上说的选择的质数进制
    2023-11-08:用go语言,字符串哈希原理和实现比如p=233,也就是课上说的选择的质数进制"31256..."01234hash[0]=3*p的0次方hash[1]=3*p的1次方+1*p的0次方hash[2]=3*p的2次方+1*p的1次方+2*p的0次方hash[3]=3*p的3次方+1*p的2次方+2*p......
  • 判断一个数是否为质数
    #include<stdio.h> intmain(){   intnum=17;   intisPrime=1;      for(inti=2;i<=num/2;i++){       if(num%i==0){           isPrime=0;           break;       }   }      ......
  • P4397聪明的燕姿 题解 & Miller~Rabin 质数判定
    涉及质数的时间复杂度都是玄学的。——题记传送门由整数唯一分解定理:\(\coprod\limits_{i=1}^{k}p_i^{c_i}\)有该正整数的正约数为:\(\coprod\limits_{i=1}^k(\sum\limits_{j=0}^{c_i}p_i^j)\)即我们要求有多少个数满足\(\coprod\limits_{i=1}^k(\sum\limits_{j=0}^{c_i}p_i^......
  • 判断一个数是质数
    判断一个数是质数publicclassPrimeNumberChecker{publicstaticbooleanisPrime(intnumber){if(number<=1){returnfalse;//1和负数不是质数}if(number<=3){returntrue;//2和3是质数}......
  • 经典题:求一个数是否为质数
    1.求一个数是否为质数publicclassMathDemo{publicstaticvoidmain(Sting[]args){//判断一个数是否为质数System.out.println(isPrime(number:13));System.out.println(isPrime(number:10));System.out.println(isPrime(number:997......
  • C++算法之旅、08 基础篇 | 质数、约数
    质数在>1的整数中,如果只包含1和本身这两个约数,就被称为质数(素数)866试除法判定866.试除法判定质数-AcWing题库\(O(n)\)boolisprime(intx){if(x<2)returnfalse;for(inti=2;i<x;i++)if(x%i==0)returnfalse;returntrue;......
  • 异质数据环境下的联邦学习
        近年来,大量数据的产生和边缘设备算力的提高,以及对数据隐私的要求使得以联邦学习为代表的分布式机器学习得到研究关注。传统的联邦学习优化方法如FEDAVG由于其简单实现且具有较低的通信代价得到了广泛的应用,但是其在异质数据环境下很难取得优秀的效果。联邦学习中各客户......
  • 取模算术运算符-应用3-分解一个整数
    C语言中分解一个整数需要使用到整除和取余运算符。两个整数相除只会保留整数,一个数对另外一个数取余,会得到余数。示例代码如下: #include<stdio.h>voidmain(){ intnum=521; intbai,shi,ge; //整除100,只会保留整数部分的百位 bai=num/100; ......
  • 取模算术运算符-应用1-判断一个数能否被另外一个数整除
    C语言中判断一个整数能否被另外一个整数整除,可以使用取模运算符%。不能直接使用两个整数相除来进行计算,因为直接使用两个整数相除,结果只会保留整数,会舍弃掉小数部分。比如使用C语言计算11/2结果为5,但是11是不能被2整除的,计算结果舍弃掉了小数部分。因此需要使用取余运算符。示......