首页 > 其他分享 >P6659 [POI 2019] Najmniejsza wspólna wielokrotność 题解

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

时间:2023-02-26 20:33:32浏览次数:40  
标签:wielokrotno return 题解 P6659 mid long ans pair first

题意

给定一个整数 \(M\),求是否存在一个区间 \([a,b]\) 使得 \(M\) 为 \([a,b]\) 这个区间中所有数的最小公倍数。

解题方法

1. 区间长度 \(= 2\)。

二分查找 \(a\),由于相邻的两个数互质, \(lcm[a,b]\) 等于 \(a(a + 1)\)。

2. 区间长度 \(> 2\)

此时,发现 \(a\) 和 \(b\) 都不是很大,\(a\) 最大不超过 \(1.5 \times 10^6\),可以接受直接预处理的时间复杂度。

因此,我们枚举左端点 \(a\),向右进行累乘,直到最小公倍数大于 \(10^{18}\)。

可以用 map 进行左右端点的映射。

代码实现

#include <bits/stdc++.h>
using namespace std;
const long long inf = 1e18;
int n;
long long m;
map<long long, pair<int, int> > M;
long long gcd(long long x, long long y)
{
	return y ? gcd(y, x % y) : x;
}
void init()
{
	for (long long l = 1; l <= 1500000; l ++)
	{
		long long res = (long long)(l * (l + 1));
		for (int r = l + 2; ; r ++)
		{
			res /= gcd(res, r);
			if (res > inf / r) break;
			res *= r;
			if (!M.count(res)) M[res] = make_pair(l, r);
		}
	}
}
pair<int, int> search(long long x)
{
	int l = 1, r = 1e9;
	while (l <= r)
	{
		long long mid = l + r >> 1;
		if (mid * (mid + 1) > x) r = mid - 1;
		else if (mid * (mid + 1) < x) l = mid + 1;
		else return make_pair(mid, mid + 1);
	}
	return make_pair(0, 0);
}
int main()
{
	init();
	scanf("%d", &n);
	while (n --)
	{
		scanf("%lld", &m);
		pair<int, int> ans = M[m];
		if (ans.first)
		{
			printf("%d %d\n", ans.first, ans.second);
			continue;
		}
		ans = search(m);
		if (ans.first) printf("%d %d\n", ans.first, ans.second);
		else puts("NIE");
	}
}

标签:wielokrotno,return,题解,P6659,mid,long,ans,pair,first
From: https://www.cnblogs.com/tongyuxin/p/17157559.html

相关文章

  • 2023 年 CCF 春季测试赛模拟赛 - 2 题解
    T1约数和标准解法\(n=a_1^{b_1}\timesa_2^{b_2}\dotsa_k^{b_k}\)那么根据算术基本定理的推广,约数个数和约数和都是可以快速计算得到约数和sum\(sum=(a_1^0......
  • CF1776M 题解
    引理1:若\(n\)为偶数,则答案为\(n\)。若\(n\)是叶子,则显然正确。若\(n\)不是叶子,则将整棵树看做以\(n\)为根的有根树,一定可以保证最后一个被删除的是根。故得......
  • AtCoder Beginner Contest 281 A-F 题解
    比赛链接A-CountDown先这样,就这样。点击查看代码#include<cstdio>intn;intmain(){ scanf("%d",&n); for(inti=n;i>=0;i--)printf("%d\n",i); re......
  • Codeforces Round #853 (Div. 2) 题解
    CodeforcesRound#853(Div.2)题解ABCDCodeforcesRound#853(Div.2)|萌新实况被吊打|ABCD题解E.ServalandMusicGame分两种情况讨论:\(\lfloor\frac{s_......
  • 【题解】ARC157
    AtcoderRegularContest157AXXYYX可以考虑得到\(a,b,c,d\)后如何构造,实际上是先根据\(b,c\)铺出形如XYXYXYXYX的序列,之后每存在一个XX或YY就填进去一个X......
  • AcWing 第 92 场周赛 C题 4866. 最大数量 题解
    原题链接链表+并查集乱搞做法:思路首先可以发现,想要让度数尽量大,那我们应该构造成菊花图,即下图所示:对于每个需求,我们可以知道,如果之前他们没有连在一起,那我们一定得......
  • [WC/CTS2023] 楼梯 题解
    题目链接简要题意有一块楼梯,这里指的楼梯是倒着的,正过来看上一层宽度一定小于等于这一层宽度,并且由格子组成,你需要对其进行增删和恢复某一历史版本的操作,并回答这块楼梯......
  • 适用于初学者的CF1654E Arithmetic Operations题解
    题目让我们求改变数字的最少次数,那我们转化一下,求可以保留最多的数字个数\(cnt\),再用\(n\)减一下就行,即\(res=n-cnt\)。我们先考虑两种暴力方法。第一种暴力方......
  • CF717A Festival Organization 题解
    传送门首先考虑求出长度为\(i\)的合法串的个数。很明显可以想到用dp解。设\(f_{i,0/1}\)为长度为\(i\)最后一位为\(0/1\)的合法串个数。可以很容易想到转移......
  • ABC267D 题解
    前言题目传送门!更好的阅读体验?两篇题解的代码写得很复杂,我是没有想到。思路很显然对于一个点,它必定会进入一个循环节。如何判断它进入循环节了呢?当一个点被经过两次,......