题解:P14304 【MX-J27-T1】分块
核心思想:找规律。
Part 1 暴力做法
直接按照题意模拟,可以获得
这一部分非常简单,观察题目发现要找满足
#include<bits/stdc++.h>
#define int long long
#define INF 1145141919810
using namespace std;
int q,n;
signed main(){
ios_base::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>q;//多测
while(q--){
cin>>n;
int ans=0;//统计
for(int i=1;i<=n;i++)
if(i%((int)sqrt(i))==0)
ans++;//符合条件
cout<<ans<<"\n";
}
return 0;
}
Part 2 正解观察
看着这道题就感觉有规律可循,所以我们直接弄一组
跑出来:
1
2
3
4
4
5
5
6
7
7
7
8
8
8
9
10
10
10
10
11
11
11
11
12
13
13
13
13
13
14
14
14
14
14
15
16
16
16
16
16
16
17
17
17
17
17
17
18
19
19
稍加观察,就可以发现一定规律并对其进行分组:
1 2 3
4 4 5 5 6
7 7 7 8 8 8 9
10 10 10 10 11 11 11 11 12
13 13 13 13 13 14 14 14 14 14 15
16 16 16 16 16 16 17 17 17 17 17 17 18
19 19 ...
...
发现对于第
Part 3 半个正解
按照上文去枚举
我们需要确定 可以发现,其实是不需要取模的,不过我就按照赛时取模的想法写出来了)。
如果
代码如下。
#include<bits/stdc++.h>
#define int long long
#define INF 1145141919810
using namespace std;
int q,n;
signed main(){
ios_base::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>q;
while(q--){
cin>>n;
int ans=0,kkl=0;
for(int i=0;;i++){
int x=i;
if((x+1)*(x-1)<n&&n<=(x+2)*x){
ans=x;//找出 i,用 ans 表示
break;
}
}
int modu=(n-(ans+1)*(ans-1))%(ans*2+1);//位置
if(modu==0)kkl=3;
else if(modu<=ans)kkl=1;
else kkl=2;//判断
cout<<(ans-1)*3+kkl<<"\n";//输出
}
return 0;
}
Part 4 正解
我们发现 Part 3 时间复杂度太高,达到了
一个无脑做法:直接从
……