Background
万人血书 KHIN 完成女装 flag(1/10000) →→ 万人血书 KHIN 完成女装 flag(2/10000)(1/5000) →→ 万人血书 KHIN 完成女装 flag(2/5000)(1/2500) →→ 万人血书 KHIN 完成女装 flag(2/2500)(1/1250) →→ 万人血书 KHIN 完成女装 flag(2/1250)(1/625) ⋯⋯ 以此类推,在可以约分的情况下,“万人血书”很快就能完成。
Description
“�x 人血书”的过程可以看成一个函数 �(�)f(x):
有一个 0�x0 的分数。重复以下步骤直到这个分数为 11:
- 分子 +1+1。
- 如果这个分数可以约分,约分到最简形式。
现在小 D 给了你 �T 组数据,每组数据都是给定 �n,求在 1≤�≤�1≤x≤n 的情况下 �(�)f(x) 的最大操作次数。
但是他太菜了,不会,你能帮帮他吗?
Input
第一行一个正整数 �T。
接下来 �T 行,每行一个正整数 �n。
Output
共 �T 行,每行一个整数 �s 表示在 1≤�≤�1≤x≤n 的情况下 �(�)f(x) 的最大操作次数。
Sample 1
Inputcopy | Outputcopy |
---|---|
5 1 2 5 8 114514 | 1 2 5 7 114493 |
Hint
样例解释
�(1)=1,�(2)=2,�(3)=3,�(4)=3,�(5)=5f(1)=1,f(2)=2,f(3)=3,f(4)=3,f(5)=5。
我也想把更大的 �(�)f(x) 列出来,但是地方不够了。
数据范围
对于全部数据,1≤�≤5×1051≤T≤5×105,1≤�≤2×1061≤n≤2×106。
Subtask 中没填的部分表示和全部数据的范围一样。
子任务编号 | �T 的范围 | �n 的范围 | 特殊性质 | 分值 |
---|---|---|---|---|
Subtask 11 | �≤3T≤3 | �≤10n≤10 | 1010 | |
Subtask 22 | �≤5T≤5 | �≤103n≤103 | 3030 | |
Subtask 33 | �n 为质数 | 1010 | ||
Subtask 44 | �≤5×105n≤5×105 | 2020 | ||
Subtask 55 | 3030 |
#include<iostream>
#include<string>
#include<algorithm>
#include<map>
#include<vector>
#define endl '\n'
#define ll long long
#define int ll
using namespace std;
const int N=2e6+7;
int vis[N];
vector<int> v;
signed main()
{
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
int T;
cin>>T;
for(int i=2;i*i<N;i++)
{
if(vis[i]==1) continue;
for(int j=i*i;j<N;j+=i)
{
vis[j]=1;
}
}
while(T--)
{
int n;
cin>>n;
for(int i=n;;i--)
{
if(vis[i]!=1)
{
cout<<i<<endl;
break;
}
}
}
return 0;
}