hdu1695 容斥原理 莫比烏斯反演

2021-09-07 09:02:13 字數 1062 閱讀 9932

給定兩個數b,d,問[1,b]和[1,d]區間上有多少對互質的數。(x,y)和(y,x)算乙個。

對於[1,b]部分,用尤拉函式直接求。對於大於b的部分,求n在[1,b]上有多少個互質的數,用容斥原理。

主要學習容斥原理的寫法,本題使用dfs。容斥原理複雜度比較高,是指數複雜度。

輸出長整型不能用lld,必須用i64d。

#include#include#include#include#includeusing namespace std;

typedef long long ll;

const int maxn = 1e5 + 7;

int a, b, c, d, k;

bool isprime[maxn];

ll euler[maxn];

ll sumeuler[maxn];

int p[maxn][20], ps[maxn];

void initprimes()

for (int i = 2; i < maxn; i++)}}

sumeuler[1] = 1;

for (int i = 2; i < maxn; i++)

}ll dfs(int ind, int n, int x)

return s;

}ll huzhi(int n, int x)

int main()

}printf("case %d: %i64d\n", caseid, ans);

}return 0;

}

容斥原理的另一種寫法:

int calc(int n,int m)//n < m,求1-n內和m互質的數的個數

for (int j = 0; j < psize&&i*prime[j] < maxn; j++)

else

}sumeuler[i] = sumeuler[i - 1] + euler[i];

}}ll eu(int b)

void debug()

return 0;

}

HDU 1695 莫比烏斯思想基礎題

題目傳送門 莫比烏斯反演參考資料 我們現在就是求f 1 即x為1,所以就是所有的d都滿足,即列舉所有的d 1 b 注意減去重複的部分。include using namespace std const int maxn 1000000 bool check maxn 10 int prime max...

hdu5072 莫比烏斯

給出n個數,問其中有多少三元組 a,b,c 使得 a,b b,c a,c 1 or a,b 1 and a,c 1 and b,c 1 n 10 5,ai 10 5.首先可以把問題抽象為有n個點,兩兩連邊,有紅邊和藍邊,問三邊同色三角形有多少。然後考慮算反面,發現只要找從乙個點出發的兩種邊分別有幾條...

hdu 5468 莫比烏斯 搜尋

hdu 5468 puzzled elena 快速通道 sample input 5 1 21 3 2 42 5 6 2 3 4 5 sample output case 1 1 1 0 0 0 題意 在一棵樹上,每個節點有值,求以x為根節點的樹中,有多少與根節點互質 思路 用num i 記錄節點中...