涉及的知识点还是挺多的,这题时间特卡。。。。
1.毕达哥斯拉三元组:
三元组(a,b,c),其中a,b,c无公因数,且满足a² +b² =c²。
a为奇数,b为偶数,c为奇数
可以得到如下勾股数组定理:
a = 2m*n;
b = m^2 - n^2;
c = m^2 + n^2;
其中m,n奇偶性不同
2.欧拉函数:
enlur[n]小于n且与n互素的数字个数
3.容斥原理
//毕达哥斯拉三元组,欧拉函数,容斥原理 /******************************************** Author :Crystal Created Time : File Name : ********************************************/ #include <cstdio> #include <cstdlib> #include <iostream> #include <algorithm> #include <cstring> #include <climits> #include <string> #include <vector> #include <cmath> #include <stack> #include <queue> #include <set> #include <map> #include <sstream> #include <cctype> using namespace std; typedef long long ll; typedef pair<int ,int> pii; #define MEM(a,b) memset(a,b,sizeof a) #define CLR(a) memset(a,0,sizeof a); const int inf = 0x3f3f3f3f; const int MOD = 1e9 + 7; #define maxn 1000005 //#define LOCAL ll ans = 0; int euler[maxn]; int s; int v[maxn]; int primer[maxn]; int gget[maxn]; int x = 0; void init(){ euler[1] = 1; for(int i=1;i<maxn;i++)euler[i] = i; for(int i=2;i<maxn;i++){ if(euler[i] == i){ primer[i] = 1; gget[x++] = i; for(int j=i;j<maxn;j+=i){ euler[j] = euler[j]/i*(i-1); } } } } void check(int a){ s = 0; if(primer[a]){ v[s++] = a; return; } int res = a; for(int i=0;gget[i]*gget[i]<=a;i++){ if(res%gget[i]==0){ v[s++] = gget[i]; while(res%gget[i]==0)res/=gget[i]; } } if(res > 1)v[s++] = res; } void solve(int cnt, int state ,int pos,int b){ if(pos == s){ if(cnt%2){ ans -= b/state; } else ans += b/state; return; } solve(cnt+1,state*v[pos],pos+1,b); solve(cnt,state,pos+1,b); } int main() { #ifdef LOCAL freopen("in.txt", "r", stdin); // freopen("out.txt","w",stdout); #endif init(); int t;cin >> t; while(t--){ ans = 0; ll l;cin >> l; ll a = (ll)sqrt(l); for(ll i = a;i>=1;i--){ ll b = (ll)sqrt(l-i*i); if(i%2==0){ if(b>=i){ ans += euler[i]; } else{ check(i); solve(0,1,0,b); } } else{ check(i); if(b>=i){ solve(0,1,0,i/2); } else solve(0,1,0,b/2); } } cout << ans << endl; } return 0; }