站外题求助
  • 板块灌水区
  • 楼主xiaofu15191
  • 当前回复6
  • 已保存回复6
  • 发布时间2022/7/9 21:31
  • 上次更新2023/10/27 21:18:40
查看原帖
站外题求助
242317
xiaofu15191楼主2022/7/9 21:31

题面如下:

代码:

#include<iostream>
#include<set>
using namespace std;
unsigned long long a[20][20],s[20];
set<unsigned long long>b[20];
unsigned long long gcd(unsigned long long n,unsigned long long m)
{
	if(n%m==0)
		return m;
	else
		return gcd(m,n%m);
}
unsigned long long lcm(unsigned long long n,unsigned long long m)
{
	return n*m/gcd(n,m);
}
int main()
{
	unsigned long long n,k;
	cin>>n>>k;
	for(int i=1;i<=n;i++)
	{
		unsigned long long t;
		cin>>t;
		a[1][i]=t;
		b[1].insert(t);
	}
	s[1]=n;
	for(int i=2;i<=n;i++)
	{
		for(int j=1;j<=s[i-1];j++)
			for(int k=j+1;k<=s[i-1];k++)
				if(lcm(a[i-1][j],a[i-1][k])<=1e15)
					a[i][++s[i]]=lcm(a[i-1][j],a[i-1][k]);
		for(int j=1;j<=s[i];j++)
			b[i].insert(a[i][j]);
	}
	unsigned long long l=1,r=1e15,mid,ans=1e16;
	while(l<r)
	{
		mid=(l+r)/2;
		unsigned long long t=0;
		for(int i=1;i<=n;i++)
		{
			for(set<unsigned long long>::iterator j=b[i].begin();j!=b[i].end();j++)
			{
				if(i%2==1)
					t+=mid/(*j);
				else
					t-=i*(mid/(*j));
			}
		}
		if(t<k)
			l=mid+1;
		else
		{
			if(t==k)
				ans=min(ans,mid);
			r=mid;
		}
	}
	cout<<ans<<endl;
}

WA 30

2022/7/9 21:31
加载中...