68pts求调
  • 板块P9836 种树
  • 楼主_masppy_
  • 当前回复1
  • 已保存回复1
  • 发布时间2023/11/11 22:30
  • 上次更新2023/11/12 08:56:05
查看原帖
68pts求调
599287
_masppy_楼主2023/11/11 22:30
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=1e4+10;
const ll mod=998244353;
int n,m;
int a[maxn],prime[2000];
bool isp[maxn];
ll mut;
ll pmin[maxn][5],vis[maxn];

ll q_pow(ll a,ll b){
	ll ans=1ll;
	while(b){
		if(b%2==1){
			ans=(ans*a)%mod;
		}
		a=(a*a)%mod;
		b/=2ll;
	}
	return ans;
}

int main(){
	scanf("%d%d",&n,&m);
	//for(int i=1;i<=1500;i++) pmin[i]=1;
	memset(pmin,0x3f,sizeof(pmin));
	
	isp[1]=1;
	int cnt=0;
	for(int i=2;i<=10000;i++){
		pmin[i][1]=1;
		vis[i]=0;
		if(!isp[i]) prime[++cnt]=i;
		for(int j=2;j<=i&&i*j<=10000;j++) isp[i*j]=1;
	}
	
	bool fg=0;
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]);
		if(a[i]>1) fg=1;
	}
	
	if(!fg){
		printf("%d",1);
		return 0;
	}
	
	mut=1ll;
	for(int i=1;i<=n;i++){
		for(int j=1;prime[j]<=a[i];j++){
			ll cnt1=1;
			while(a[i]>1&&a[i]%prime[j]==0){
				a[i]/=prime[j];
				cnt1++;
			}
			if(cnt1==1) continue;
			if(!vis[prime[j]]) vis[prime[j]]++,pmin[prime[j]][1]=cnt1;
			else{
				vis[prime[j]]++;
				if(pmin[prime[j]][1]>=cnt1){
					pmin[prime[j]][2]=pmin[prime[j]][1];
					pmin[prime[j]][1]=cnt1;
				}
				else pmin[prime[j]][2]=min(pmin[prime[j]][2],cnt1);
			}
			mut=(mut*cnt1)%mod;
			//cout<<mut<<" "<<i<<" "<<prime[j]<<" "<<cnt<<endl;
		}
	}
	
	for(int j=1;prime[j]<=m;j++){
		ll cnt1=1ll;
		while(m>1&&m%prime[j]==0){
			m/=prime[j];
			cnt1++;
		}
		if(cnt1==1ll) continue;
		if(vis[prime[j]]!=n) mut=(mut*cnt1)%mod;
		else{
			cnt1--;
			while(cnt1--){
				mut=(mut+(mut*q_pow(pmin[prime[j]][1],mod-2))%mod)%mod;
				pmin[prime[j]][1]++;
				if(pmin[prime[j]][2]<pmin[prime[j]][1]) swap(pmin[prime[j]][2],pmin[prime[j]][1]);
			}
		}
	}
	
	printf("%lld",mut);
	return 0;
}
2023/11/11 22:30
加载中...