題意:
給定乙個整數l(l<=1e12),計算(x,y,z)組的個數。其中x
思路:
以下的方法可用來找出勾股數。設m>n 、 m 和 n 均是正整數,
a = m^2-n^2 b = 2mn c = m^2+n^2
若 m 和 n 是互質,而且 m 和 n 其中有乙個是偶數,計算出來的 (a, b, c) 就是素勾股數
然後我們需要的便是計算m,n互質 qie m,n一奇一偶
因為 m^2*2 = a+c,所以可以求出m的範圍 sqrt(l),然後可以求出n的範圍t
於是通過列舉m,並求出n,然後對他們進行判斷即可 參考
knownothing
①當m為偶數時,
如果m <= t,那麼n可以取[1,m]中與m互質的數,因為他們一定是奇數
如果m > t,那麼n只能取[1,t]中與m互質的數
②當m為奇數時:
如果m <= t,那麼n可以取[1,m]中與m/2互質的數,如果ai是[1,m/2]中與m互質的,那麼2*ai便是與m互質的偶數
如果m > t,那麼n只能取[1,t]中與t/2互質的數
#include #include #include #include #include #include using namespace std;
typedef long long ll;
typedef long double ld;
const ld eps=1e-10;
const int inf = 0x3f3f3f;
const int maxn = 1e6;
const int mod = 1e9+7;
bool check[maxn+10];
int prime[maxn+10];
int phi[maxn+10];
int factor[105];
int facnum;
int tot;
void phi_and_prime(int n)
for(int j = 0; j < tot; j++)
else}}
}void fac(int x)
}if(tp == 1)
break;
}if(tp > 1)
factor[facnum ++ ] = tp;
return ;
}ll ans;
void dfs(int cur,int mul,int tot,int n) //搜尋實現互斥
dfs(cur+1,mul*factor[cur],tot+1,n);
dfs(cur+1,mul,tot,n);
}int main()
else
}printf("%i64d\n",ans);
}return 0;
}
hdu 4336 容斥原理
按照解題報告的提示,用容斥原理實現 for int j bg 1 j另解 概率dp,康哥指導的 include include includeusing namespace std double f 1 21 gl 22 int main int i,j,k,n double fz,fm while...
hdu4135 容斥原理
題意 給出a,b,n,求出 a,b 範圍內與n互素的數字的個數。即b範圍內的不與n互素的數減去a範圍內不與n互素的數,把 1,a 1,b 中不與n互素的數分別求出來,再減掉就是和n互素的數了。那麼首先將n分解質因數,因子和因子的倍數可以被除盡,一定不與n互素,把這些數都記下來,篩法求素數即可 然後把...
hdu 4135 容斥原理
剛接觸,有關因子個數的增加不太弄得好,然後看到了這個神奇的遞迴 ac include includeusing namespace std define ll long long ll a,b,ansa,ansb,ans,p 100 up void dfs int n,bool tag,ll num...