真的好长时间没写代码,寄了,这题就单纯的照着要求暴力就好,可能出问题的点就一个,就是在判断小于n的一半的这点,因为题上要求一半,那么普通写就是用除法也就是 if(
v
2
v^2
v2%n<
n
2
\frac{n}{2}
2n )但是这样的话就会出现小数,如果直接用int的话,比如n=9,那么9/2 = 4.5但是程序上的结果是9/2 = 4
这样的话在判断上就会判断不了
v
2
v^2
v2%n = 4的情况。我当时调的时候脑子很傻,没转过来,直接改条件改成 <= n/2 但是这样就会出现另一种情况,即无法判断他是4.5还是4,这样的话真正相等的时候也会被算上,就会多算。
后来还是看题解才发现,我去,移项就行了if(
v
2
v^2
v2%n<
n
2
)
\frac{n}{2})
2n)这个式子中吧
1
2
\frac{1}{2}
21移过去变成×2就行了if(
v
2
v^2
v2%n*2<
n
n
n)这样就不会有小数的烦恼了,我去,这么简单,还想了半天没想出来,真是好久没写了,退化了已经。
#include<bits/stdc++.h>
using namespace std;
int n, ans = 0;
int main()
{
cin >> n;
for(int i = 1; i < n; ++i){
if((i*i)%n * 2 < n){
++ans;
}
}
cout << ans << endl;
return 0;
}