B. Longest Divisors Interval
做法:假设我们找到了一个最大区间[l, r]
,这个区间的长度为k
,那么这个区间里有一个数必定是k
的倍数(自己举个例子就能知道了),因此n
也是k
的倍数。那么我们再缩小一下区间长度,变为k - 1
,这个区间可以是[l, r - 1]
,也可以是[l + 1, r]
,这其中必定有一个数是k - 1
的倍数,而且这个数必定在原先的区间[l, r]
中,我们又可以得到n
是k - 1
的倍数,如此不断缩小区间直到区间长度为1
。那么我们就可以得到n
是 1、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;
}