求调CE
  • 板块学术版
  • 楼主MorLeaves
  • 当前回复7
  • 已保存回复7
  • 发布时间2023/11/16 18:48
  • 上次更新2023/11/16 20:24:58
查看原帖
求调CE
877691
MorLeaves楼主2023/11/16 18:48
#include<iostream>
#include<cstdio>
#include<cmath>
#include<map>
#include<queue>
#define mod 998244353
#define inf 2147483647
typedef long long ll;
using namespace std;
struct node {
	int t,id;
	bool operator>(const node &a)const
	{
		return t>a.t;
	}
};
priority_queue<node,vector<node>,greater<node> > q;
map<pair<int,int>,int> mp;
map<int,int> wmp;
int n,w,p[114514],pr[114514];
void work(int j)
{
	ll ans=1,x=p[j];
	for(int i=2;i<=x;i++)
	{
		int cnt=0;
		while(x%i==0)
		{
			x/=i;
			cnt++;
		}
		if (cnt>0)
		{
			mp[make_pair(j,i)]=cnt;
		}
		ans*=(cnt+1);
	}
}
int main()
{
	scanf("%d %d",&n,&w);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&p[i]);
		work(i);
	}
	int y=w,prcnt=0;
	for(int i=2;i<=y;i++)
	{
		int cnt=0;
		while(y%i==0)
		{
			y/=i;
			cnt++;
		}
		if (cnt>0)
		{
			prcnt++;
			pr[prcnt]=i;
		}
		wmp[i]=cnt;
	}
	for(int i=1;i<=prcnt;i++)
	{
		bool bo=false;
		int k,minn=inf;
		for(int j=1;j<=n;j++)
		{
			if (mp[make_pair(j,pr[i])]<minn)
			{
				minn=mp[make_pair(j,pr[i])];
				k=j;
			}
			if (p[j]%pr[i]!=0)
			{
				bo=true;
				k=j;
				break;
			}
		}
		if (bo==true)
		{
			p[k]*=(ll)(pow(pr[i],wmp[pr[i]]));
			p[k]%=mod;
			mp[make_pair(k,pr[i])]=wmp[pr[i]];
		}
		else
		{
//			p[k]*=(ll)(pow(pr[i],wmp[pr[i]]));
//			p[k]%=mod;
//			mp[make_pair(k,pr[i])]+=wmp[pr[i]];
			for(int j=1;j<=n;j++)
			{
				q.push({mp[make_pair(p[j],pr[i])],j});
			}
			for(int j=1;j<=wmp[pr[i]];j++)
			{
				q.top().t++;
			}
			while(!q.empty())
			{
				mp[make_pair(q.top().id,pr[i])]=q.top().t;
				q.pop();
			}
		}
	}
	ll anss=1;
	for(int i=1;i<=n;i++)
	{
		int x=p[i];
		for(int j=2;j<=x;j++)
		{
			int cnt=0;
			while(x%j==0)
			{
				x/=j;
				cnt++;
			}
			anss*=(cnt+1);
			anss%=mod;
		}
	}
	printf("%lld",anss%mod);
	return 0;
}
2023/11/16 18:48
加载中...