給定兩個數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 記錄節點中...