关于赛题#B 圆点
- 它
可能是某场比赛最水的一道题了
25pts:
暴力。
该圆的方程可以写为(x^2+y^2=r)。
我们枚举x、y,如果权值小于r,答案+=权值。
50pts:
其实我也不知道怎么做
80pts:
我们可以枚举(0~sqrt{r})内的整数横坐标(记为x),算出最大满足题意的纵坐标(记为y)。
原来我们要求的(x^2 imes 1^2+x^2 imes 2^2+x^2 imes 3^2+ldots +x^2 imes maxy^2)
用乘法分配律,原式(=x^2 imes (1^2+2^2+3^2+ldots +maxy^2))
根据小学奥数的知识,(1^2+2^2+3^2+ldots +n^2=frac{1}{6}n(n+1)(2n+1)),然后代到上面的式子里,就可以算了。
这算的是一个象限的,最后还要乘4。qaq
别忘记随时取模,防溢出。
然后你愉快地WA了4个点。
85pts:
解决方法:#define int long long
然后你会发现这玩意儿不管用诶!!!
正确方法:#define int __int128
成功TLE了3个点,真刺激。
哦,对了,如果你CE了,int main()
应改为signed main()
。
100pts:
毒瘤数论需卡常……orz
先是用了编译优化……TLE
后来才发现……
膜运算不能太多,因为是大数据类型,适当地膜就行咯qaq(当然也不能只到最后才膜一下。。。)
code:
#include <bits/stdc++.h>
#define int __int128
#pragma GCC optimize(3)
#pragma GCC target("avx")
#pragma GCC optimize("Ofast")
#pragma GCC optimize("inline")
#pragma GCC optimize("-fgcse")
#pragma GCC optimize("-fgcse-lm")
#pragma GCC optimize("-fipa-sra")
#pragma GCC optimize("-ftree-pre")
#pragma GCC optimize("-ftree-vrp")
#pragma GCC optimize("-fpeephole2")
#pragma GCC optimize("-ffast-math")
#pragma GCC optimize("-fsched-spec")
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize("-falign-jumps")
#pragma GCC optimize("-falign-loops")
#pragma GCC optimize("-falign-labels")
#pragma GCC optimize("-fdevirtualize")
#pragma GCC optimize("-fcaller-saves")
#pragma GCC optimize("-fcrossjumping")
#pragma GCC optimize("-fthread-jumps")
#pragma GCC optimize("-funroll-loops")
const int mod = 1e9 + 7;
using namespace std;
int read() {
int tmp = 0;
char c = getchar();
while(!isdigit(c)) c = getchar();
while(isdigit(c)) tmp = (tmp << 1) + (tmp << 3) + c - 48, c = getchar();
return tmp;
}
void write(int x) {
if(x > 9) write(x / 10);
putchar(x % 10 + 48);
}
signed main() {
int r = read();
int ans = 0;
for(int i = 0; i * i <= r; i++) {
int n = sqrt((double)(r - i * i));
// cout << n << " ";
ans += i * i * n + (n * (n + 1) * (2 * n + 1) / 6);
ans %= mod;
}
write(ans * 4 % mod);
return 0;
}