小A的组合数
小A的组合数
题目描述
表示组合,组合公式为:,请你求出的因子个数,由于大难会很大,请你输出的答案模上一个大数。表示末尾的个数。
题目解析
约数(因子)个数函数:
我们可以得到:
但是由于本题是分数,所以求出来的还要减去里面的
接下来就是求出有最后有多少个零:
易得,是由得到的
由于阶乘中一定比多,所以我们仅需算出中的即可,接下来就和上面思路差不多了。
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();
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效