首页 > 其他 > 详细

cf 893 E

时间:2019-02-02 10:30:28      阅读:339      评论:0      收藏:0      [点我收藏+]

有 技术分享图片 次询问,第 技术分享图片 次询问包含两个数 技术分享图片 。 
求满足下面两个要求的 技术分享图片 数组的方案数。 
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);
    }
}
View Code

 

cf 893 E

原文:https://www.cnblogs.com/MXang/p/10347517.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!