1. 程式人生 > >洛谷P5174 圓點

洛谷P5174 圓點

關於賽題#B 圓點

  • 可能是某場比賽最水的一道題了

25pts:

暴力。

該圓的方程可以寫為\(x^2+y^2=r\)

我們列舉x、y,如果權值小於r,答案+=權值。


50pts:

其實我也不知道怎麼做


80pts:

我們可以列舉\(0~\sqrt{r}\)內的整數橫座標(記為x),算出最大滿足題意的縱座標(記為y)。

原來我們要求的\(x^2\times 1^2+x^2\times 2^2+x^2\times 3^2+\ldots +x^2\times maxy^2\)

用乘法分配律,原式\(=x^2\times (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;
}