码迷,mamicode.com
首页 > 其他好文 > 详细

cf 893 E

时间:2019-02-02 10:45:11      阅读:287      评论:0      收藏:0      [点我收藏+]

标签: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);
    }
}
View Code

 

cf 893 E

标签:pen   nbsp   i++   分解质因数   code   none   sed   prime   names   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!