给出x和y,求一个长度为y的序列,其乘积为x,允许有负数,求这种序列的个数,
x分解质因数,考虑每个 p^e, 把e分为y 份( 可以为0),个数为 C( e+y-1,e)
这题需要乘法逆元 来进行乘法
比如想组合数 n!/ (n-m)! * m! , 转化为 n!* fnv(n-m)! *fnv(m!)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | #include <iostream> #include <cstring> #include <queue> using namespace std ; const int N =1e6+100; #define int long long const int mod =1e9+7; int m,n,fac[N],fnv[N],Pow[N]; int ksm( int x, int y){ if (y==0) return 1; int t= ksm(x,y/2) ; if (y&1) return ((t*t%mod)*x)%mod; return t*t%mod; } int inv( int x){ return ksm(x,mod-2)%mod ; } int C( int x, int y){ return (((fac[x]*fnv[y])%mod)*fnv[x-y])%mod; } int cal( int x){ return C(x+n-1,x); } void split( int x){ int ans=Pow[n-1];ans%=mod; for ( int i=2;i*i<=x;i++){ if (x%i==0){ int t=0; while (x%i==0) t++,x/=i; ans*=cal(t),ans%=mod; } } if (x>1){ ans*=cal(1); ans%=mod; } cout<<ans<<endl; } void solve(){ cin>>m>>n; split(m); } signed main(){ Pow[0]=fac[0]=fnv[0]=1; for ( int i=1;i<=1e6+98;i++) { fac[i]=fac[i-1]*i,fac[i]%=mod, Pow[i]=Pow[i-1]*2,Pow[i]%=mod, fnv[i]=inv(fac[i]),fnv[i]%=mod; } int tes;cin>>tes; while (tes--) solve(); } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!