标签:pen nbsp i++ 分解质因数 code none sed prime names
有 次询问,第 次询问包含两个数 。
求满足下面两个要求的 数组的方案数。
1. 数组由 个整数构成
2.
A与B不同当且仅当至少存在一个数 满足 。答案对 取模
数据范围:
显然对x分解质因数,如果某个质因子幂次为t,根据挡板法对答案的贡献就是 。
又因为可是是负的,每次挑选偶数个让它变成负的,那么答案就是
代码这里可以预处理一下2的次幂会更快一点,
#include <bits/stdc++.h> using namespace std; typedef long long ll; const ll mod = 1e9+7; ll qpow(ll a,ll x){ ll res=1; while (x){ if(x&1) res=res*a%mod; a=a*a%mod; x/=2; } return res; } int prime[1005],cnt=0,vis[1005]; ll up[2000005],inv[2000005],down[2000005]; void init(){ for(int i=2;i<=1001;i++){ if(vis[i])continue; prime[cnt++]=i; for(int j=2*i;j<=1001;j+=i){ vis[j]=1; } } down[0]=up[0]=inv[1]=1; for(int i=2;i<=2e6;i++){ inv[i]=(mod-mod/i)*inv[mod%i]%mod; } for(int i=1;i<=2e6;i++){ up[i]=up[i-1]*i%mod; down[i]=down[i-1]*inv[i]%mod; } } ll C(ll x,ll y){ return up[x]*down[y]%mod*down[x-y]%mod; } int q,x,y; int main(){ //ios::sync_with_stdio(false); init(); scanf("%d",&q); while (q--){ scanf("%d%d",&x,&y); ll ans = 1; for(int i=0;prime[i]*prime[i]<=x&&i<cnt;i++){ int cnt=0; while (x%prime[i]==0){ x/=prime[i]; cnt++; } if(cnt)ans=ans*C(y+cnt-1,cnt)%mod; } if(x!=1)ans=ans*y%mod; ans=ans*qpow(2,y-1)%mod; printf("%lld\n",ans); } }
标签:pen nbsp i++ 分解质因数 code none sed prime names
原文地址:https://www.cnblogs.com/MXang/p/10347517.html