小A的组合数

小A的组合数

题目描述

Cnm表示组合,组合公式为:Cnm=n!m!×(nm)!,请你求出Cnm的因子个数tot,由于大难会很大,请你输出的答案模上一个大数mod=109+7+cntcnt表示n!末尾0的个数。

题目解析

约数(因子)个数函数:

n=p1k1p2k2...pnknτ(n)=(k1+1)(k2+1)(k3+1)...(kn+1)

我们可以得到:

k1=np1+np12+np13+....+np1j

k2=np2+np22+np23+....+np2j

k3=np3+np32+np33+....+np3j

但是由于本题是分数,所以求出来的k还要减去m,nm里面的k

接下来就是求出n!有最后有多少个零:

易得,10是由25得到的

由于阶乘中2一定比5多,所以我们仅需算出5k中的k即可,接下来就和上面思路差不多了。

CODE

#include<bits/stdc++.h>
#define ll __int128
using namespace std;
const int maxn = 2e6+43;
inline ll read_int(){
	ll a=0;bool f=0;char g=getchar();
	while(g<'0'||'9'<g) {if(g=='-') f=1;g=getchar();}
	while('0'<=g&&g<='9') a=a*10+g-'0',g=getchar();
	return f ? -a : a;
}

inline void write(ll a,bool b=1){
	char lin[30];int top=0;
	if(a<0) a=-a,putchar('-');
	while(a){
		lin[++top]=a%10+'0';
		a/=10;
	}
	if(!top) lin[++top]='0';
	while(top) putchar(lin[top--]);
	if(b) putchar('\n');
}

ll wu[100]={0,5,25,125,625,3125,15625,78125,390625,1953125,9765625};
int go=11;
ll mod=1e9+7,MOD;

ll top=0,prime[maxn];
bool no[maxn];
inline void Prime(){
	for(ll i=2;i<=2e6;i++){
		if(!no[i]) prime[++top]=i;
		for(ll e=1;e<=top&&prime[e]*i<=2e6;e++){
			no[prime[e]*i]=1;
			if(i%prime[e]==0) break;
		}
	}
}

inline void read(){
	ll n=read_int(),m=read_int();
	ll cnt=0;
	for(int i=1;i<=10;i++) cnt+=n/wu[i];
//	cout<<cnt<<endl;
	MOD=mod+cnt;
	ll N=n,M1=m,M2=n-m;
	ll ans=1;
	for(int i=1;i<=top&&prime[i]<=n;i++){
		ll k=0,jl=1;
		for(int e=1;jl<=n;e++){
			jl*=prime[i];
			k=k+(N/jl-M1/jl-M2/jl);
		}
//		cout<<prime[i]<<" "<<k<<endl;
		ans=ans*(k+1)%MOD;
	}
	write(ans);
}

int main (){
	freopen("A.in","r",stdin);
	freopen("A.out","w",stdout);
	Prime();
	int T=read_int();
	while(T--) read();
}

posted @   轩Demonmaster  阅读(78)  评论(5编辑  收藏  举报
相关博文:
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
点击右上角即可分享
微信分享提示