有 cf 893 E 次询问,第 cf 893 E 次询问包含两个数 cf 893 E 。 
求满足下面两个要求的 cf 893 E 数组的方案数。 
1. cf 893 E 数组由 cf 893 E 个整数构成 
2. cf 893 E 
A与B不同当且仅当至少存在一个数 cf 893 E 满足 cf 893 E 。答案对 cf 893 E 取模 
数据范围: cf 893 E

显然对x分解质因数,如果某个质因子幂次为t,根据挡板法对答案的贡献就是 cf 893 E

又因为可是是负的,每次挑选偶数个让它变成负的,那么答案就是 cf 893 E

代码这里可以预处理一下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);
    }
}
View Code

相关文章:

  • 2021-10-11
  • 2021-07-31
  • 2021-12-08
  • 2021-09-19
  • 2022-02-03
  • 2021-08-12
  • 2021-07-02
  • 2021-05-19
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-09-07
  • 2021-08-30
  • 2022-12-23
  • 2021-09-14
相关资源
相似解决方案