1. 程式人生 > >BZOJ 1041 圓上的整點 數學

BZOJ 1041 圓上的整點 數學

memset geo 宏定義 引用 accepted tps ems min accept

題目鏈接:

https://www.lydsy.com/JudgeOnline/problem.php?id=1041

題目大意:
求一個給定的圓(x^2+y^2=r^2),在圓周上有多少個點的坐標是整數。

思路:

看視頻:

技術分享圖片https://www.bilibili.com/video/av12131743/ 思路: 對於半徑的平方進行質因數分解為p1q1p2q2...pnqn,ans = 4 * ∏(q1+1)(對於所有的pi滿足模3為1) 由於這裏給的半徑是整數,直接對半徑進行質因數分解,半徑的平方只需在每個指數上乘以2即可。
 1 #include<bits/stdc++.h>
 2 #define
IOS ios::sync_with_stdio(false);//不可再使用scanf printf 3 #define Max(a, b) ((a) > (b) ? (a) : (b))//禁用於函數,會超時 4 #define Min(a, b) ((a) < (b) ? (a) : (b)) 5 #define Mem(a) memset(a, 0, sizeof(a)) 6 #define Dis(x, y, x1, y1) ((x - x1) * (x - x1) + (y - y1) * (y - y1)) 7 #define MID(l, r) ((l) + ((r) - (l)) / 2) 8
#define lson ((o)<<1) 9 #define rson ((o)<<1|1) 10 #define Accepted 0 11 #pragma comment(linker, "/STACK:102400000,102400000")//棧外掛 12 using namespace std; 13 inline int read() 14 { 15 int x=0,f=1;char ch=getchar(); 16 while (ch<0||ch>9){if (ch==-) f=-1;ch=getchar();} 17 while (ch>=
0&&ch<=9){x=x*10+ch-0;ch=getchar();} 18 return x*f; 19 } 20 21 typedef long long ll; 22 const int maxn = 100 + 10; 23 const int MOD = 1000000007;//const引用更快,宏定義也更快 24 const int INF = 1e9 + 7; 25 const double eps = 1e-6; 26 27 int main() 28 { 29 ll n; 30 cin >> n; 31 while(n % 2 == 0)n /= 2; 32 ll ans = 1; 33 for(ll i = 3; i <= n; i += 2) 34 { 35 if(i % 4 == 3) 36 { 37 while(n % i == 0)n /= i; 38 continue; 39 } 40 if(n % i == 0) 41 { 42 ll tmp = 0; 43 while(n % i == 0)tmp++, n /= i; 44 ans *= (tmp * 2 + 1); 45 } 46 } 47 if(n % 4 == 1 && n > 1)ans *= 3; 48 ans *= 4; 49 cout<<ans<<endl; 50 return Accepted; 51 }

BZOJ 1041 圓上的整點 數學