P6659 [POI 2019] Najmniejsza wspólna wielokrotność

题目 【传送门】

        有z组数据,每组数据 给定一个整数 M,求一个区间 [a,b] 使得 M 为这个区间所有数的最小公倍数。 对于 100% 的数据,1≤z≤10^{4}1≤M≤10^{18}

        如有多组解:  输出a最小的

        如果还有多组解输出b最小的

分析

  • 如果区间大小为 2,我们考虑到 b 不会很大,所以我们可以使用二分找到区间 [a,b]。
  • 否则可以通过直接模拟,用map存储
#include
#define ll long long
using namespace std;
ll n,t,inf=1e18;
struct node{ ll l,r; };
node ans1,ans2;
map ma;
node ef(ll x)
{
	ll l=1,r=1e9;//r如果开到x,可能会爆long long
	while(l<=r)
	{
		ll mid=(l+r)/2;
		if(mid*(mid+1)==x) return (node){mid,mid+1}; 
		else if(mid*(mid+1)inf/r) break;
			sum*=r;
			if(!ma.count(sum)) ma[sum]=(node){l,r};
		}
	}
}
int main()
{
	scanf("%lld",&t); pre();
	while(t--)
	{
		scanf("%lld",&n);
		if(n&1) { cout<<"NIE\n"; continue; }
		ans1=ef(n); ans2=ma[n];
		if(!ans1.l && !ans2.l) cout<<"NIE\n";
		else if(ans1.l && !ans2.l) cout<ans2.l) cout<

你可能感兴趣的:(算法,数据结构)