贪心哪里错了
  • 板块P9836 种树
  • 楼主thlm
  • 当前回复2
  • 已保存回复2
  • 发布时间2023/11/12 18:50
  • 上次更新2023/11/12 20:44:05
查看原帖
贪心哪里错了
554584
thlm楼主2023/11/12 18:50
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#include<map>
#include<stack>
#include<ctime>
#define mn 31000
#define ll long long
#define modd 998244353
using namespace std;
inline ll read(){
	ll x=0,f=1;
	char ch=getchar();
	while('0'>ch || ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while('0'<=ch && ch<='9'){x=x*10+(ch-'0');ch=getchar();}
	return x*f;
};
int n,w;
bool fi[mn];
int zs[mn],zl;
int p[mn];
priority_queue<ll,vector<ll>,greater<ll> > q;
int main(){
	n=read();w=read();
	if(n==1){
		ll pl=read()*w;
		ll ans=0;
		for(int i=1;i*i<=pl;i++){
			if(pl%i==0){
				if(pl==i*i) ans=(ans+1)%modd;
				else ans=(ans+2)%modd;
			}
		}cout<<ans%modd;
	}else{
		for(int i=2;i<=mn;i++){
			if(!fi[i]){zl++;zs[zl]=i;}
			for(int j=1;j<=zl;j++){
				if(i*zs[j]>mn) break;
				fi[i*zs[j]]=1;
			}
		}
		for(int i=1;i<=n;i++) p[i]=read();
		ll ans=1;
		for(int i=1;i<=zl;i++){
			int sl=0;
			while(w%zs[i]==0){w=w/zs[i];sl++;}
			for(int j=1;j<=n;j++){
				ll cl=0;
				while(p[j]%zs[i]==0){p[j]=p[j]/zs[i];cl++;}
				if(!cl){
					if(sl) sl--,cl++,q.push(cl+1);
				}else q.push(cl+1);
			}
			while(sl){
				ll nowl=q.top();
				q.pop();q.push(nowl+1);sl--;
			}
			while(!q.empty()){
				ans=(1ll*ans*q.top())%modd;q.pop();
			}
		}printf("%lld",ans);
	}
	return 0;
}
2023/11/12 18:50
加载中...