Codeforces #889 div2 B

发布时间 2023-07-30 15:11:07作者: dkdklcx

B. Longest Divisors Interval


做法:假设我们找到了一个最大区间[l, r],这个区间的长度为k,那么这个区间里有一个数必定是k的倍数(自己举个例子就能知道了),因此n也是k的倍数。那么我们再缩小一下区间长度,变为k - 1,这个区间可以是[l, r - 1],也可以是[l + 1, r],这其中必定有一个数是k - 1的倍数,而且这个数必定在原先的区间[l, r]中,我们又可以得到nk - 1的倍数,如此不断缩小区间直到区间长度为1。那么我们就可以得到n1、2、3 ... k的倍数,因此我们只需从1向上枚举,一旦n不能整除这个数就退出循环即可得到答案。

code
#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
#include <map>
#include <queue>
#include <stack>
#include <deque>
#include <cmath>
#include <string>
#include <set>
#define x first
#define y second
using namespace std;

typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int, int> PII;
typedef pair<double, int> PDI;
typedef pair<double, double> PDD;
int dx[4] = { -1, 1, 0, 0 }, dy[4] = { 0, 0, -1, 1 };

const int N = 100010;

LL n;

void solve()
{
	LL ans, i;
	cin >> n;
	for (i = 1, ans = 1; i <= n; i++, ans++)
		if (n % i != 0)break;

	cout << ans - 1 << endl;
}

int main()
{
    ios::sync_with_stdio(false);
	cin.tie(0), cout.tie(0);
	int t; cin >> t;
	while (t--)
	{
		solve();
	}

	return 0;
}