5pts求调
  • 板块P9836 种树
  • 楼主黑影洞人
  • 当前回复2
  • 已保存回复2
  • 发布时间2023/11/12 16:59
  • 上次更新2023/11/18 16:59:25
查看原帖
5pts求调
285617
黑影洞人楼主2023/11/12 16:59
#include<cstdio>
#include<algorithm>
#include<cstring>
#define N 11451
#define int long long
#define p 998244353
using namespace std;
int n,w,m;
int a[2005][N];
int id[N],prime[N]; 
bool vis[N];
inline void prrrr(int nn){
	memset(vis,0,sizeof(vis));
	m=0;
	vis[1]=1;
	for(int i=2;i<=nn;i++){
		if(vis[i]==0){
			prime[++m]=i;
			id[i]=m;
		}
		for(int j=1;j<=m&&i*prime[j]<=nn;j++){
			vis[i*prime[j]]=1;
			if((i%prime[j])==0)break;
		}
	}
}
signed main(){
	prrrr(N-1);
	scanf("%lld%lld",&n,&w);
	for(int i=1;i<=n;i++){
		int x;
		scanf("%lld",&x);
		int now=2;
		for(int j=1;j<=m;j++)a[j][i]++;
		while(x>1){
			if(x%now){
				now++;	
				continue;
			}
			x/=now;
			a[id[now]][i]++;
		//	printf("%lld %lld %lld\n",now,id[now],a[id[now]][i]);
		}
	//	puts("__________");
	} 
	int ans=1;
	for(int i=1;i<=m;i++){
		if(w%prime[i])continue;
		sort(a[i]+1,a[i]+n+1);
		int cnt=0;
		while(w%prime[i]==0){
			cnt++;
			w/=prime[i];
		}
		for(int j=1;j<=n;j++){
			if(cnt==0)break;
			while(a[i][j]<=a[i][j+1]&&cnt>0)a[i][j]++,cnt--;
		}
		for(int j=1;j<=n;j++)ans=(ans*a[i][j])%p;
	}
	printf("%lld",ans);
	return 0;
}



2023/11/12 16:59
加载中...