求助TLE
查看原帖
求助TLE
127925
Kio_楼主2021/11/18 11:35

感到非常莫名其妙......

#include<cstdio>
#include<cmath>
#include<bitset>
#include<ctime>

using namespace std;

typedef long long ll;

const int mod = 1e9+7, N = 1e5+20;

inline bool isd(int c){return '0'<=c&&c<='9';}
int read(){
	int num,c,f=1;
	for(;!isd(c=getchar());f=c);
	for(num=c^48;isd(c=getchar());(num*=10)+=c^48);
	return f^45?num:-num;
}

ll ksm(ll a,ll p){
	ll sum=1;
	while(p){
		if(p&1) sum=sum*a%mod;
		a=a*a%mod;
		p>>=1;
	}
	return sum;
}

int n=N-10;
ll x,y;
ll jc[N], inv[N], prime[N],cnt,ans;
bitset<N> vis;

void init(){
	jc[0] = inv[0] = 1;
	for(int i=1;i<=n;i++) jc[i] = 1ll*jc[i-1]*i%mod;
	inv[n] = ksm(jc[n],mod-2);
	for(int i=n-1;i;i--) inv[i] = 1ll*inv[i+1]*(i+1)%mod;
	for(int i=2;i<=n;i++){
		if(!vis[i]) prime[++cnt] = i;
		for(int j=1;j<=cnt&&1ll*i*prime[j]<=n;j++){
			vis[i*prime[j]] = 1;
			if(!(i/prime[j])) break;
		}
	}
}
inline ll C(ll a,ll b){
	return (jc[a]*inv[b]%mod)*inv[a-b]%mod;
}
ll workcnt(ll a,ll p){
	ll sum=0;
	while(p%a==0) p/=a,sum++;
	return sum;
}
int T;
//void solve(){
//	x=read(),y=read(),ans=1;
//	for(int i=1;i<=cnt;i++){
//		if(prime[i]>x) break;
//		if(!(x%prime[i])) ans = (ans*C(workcnt(prime[i],x)+y-1,y-1))%mod;
//	}
////	printf("%lld\n",(ans*ksm(2,y-1))%mod);
////	printf("T:%d\n",T);
//}

int main(){
//	freopen("data.in","r",stdin);
//	freopen("std.txt","w",stdout);
//printf("%lld\n",ksm(2,0));
//	double time1 = clock();
	init();
	T=read();
	while(T--){
		x=read(),y=read(),ans=1;
		for(int i=1;i<=cnt;i++){
			if(prime[i]>x) break;
			if(!(x%prime[i])) ans = (ans*C(workcnt(prime[i],x)+y-1,y-1))%mod;
		}
		printf("%lld\n",(ans*ksm(2,y-1))%mod);
	//	printf("T: %d\n",T);
	}
//	printf("%.3f\n",(clock()-time1)/1000);
	return 0;
}

2021/11/18 11:35
加载中...