hdu 3939 勾股 容斥

2021-07-09 07:43:42 字數 1443 閱讀 3361

題意:

給定乙個整數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...