BZOJ 2301: [HAOI2011]Problem b
生活随笔
收集整理的這篇文章主要介紹了
BZOJ 2301: [HAOI2011]Problem b
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
二次聯(lián)通門 :?BZOJ 2301: [HAOI2011]Problem b
?
?
?
?
?
/*BZOJ 2301: [HAOI2011]Problem b莫比烏斯反演 + 容斥將k除下來后就變?yōu)榱艘坏涝}后像求二維前綴和一樣減去重復(fù)計(jì)算的,再加上多減的即可 */ #include <cstdio> #include <iostream>#define rg register #define Max 50007 int p[Max], mu[Max], sm[Max]; bool is[Max]; typedef long long LL; inline LL min (LL a, LL b) { return a < b ? a : b; } inline void read (int &n) {rg char c = getchar ();for (n = 0; !isdigit (c); c = getchar ());for (; isdigit (c); n = n * 10 + c - '0', c = getchar ()); }void Euler (int N) {rg int i, j, k; int C = 0; mu[1] = 1;for (i = 2; i <= N; ++ i){if (!is[i]) p[++ C] = i, mu[i] = -1;for (j = 1; j <= C; ++ j){if ((k = i * p[j]) > N) break;is[k] = true;if (i % p[j] == 0) { mu[k] = 0; break; }else mu[k] = -mu[i];}}for (i = 1; i <= N; ++ i) mu[i] += mu[i - 1]; } LL Z (LL N, LL M) {LL res = 0; rg LL i, j;if (N > M) std :: swap (N, M);for (i = 1; i <= N; i = j + 1){j = min (N / (N / i), M / (M / i));res += (LL) (mu[j] - mu[i - 1]) * (N / i) * (M / i);}return res; } int main (int argc, char *argv[]) {int T, A, B, C, D, K; read (T); rg int i;Euler (Max - 1); LL Answer = 0;for (; T; -- T){read (A), read (B), read (C), read (D), read (K);A = (A - 1) / K, C = (C - 1) / K, B /= K, D /= K;Answer = Z (B, D) - Z (A, D) - Z (C, B) + Z (A, C);printf ("%lld\n", Answer);}return 0; }?
轉(zhuǎn)載于:https://www.cnblogs.com/ZlycerQan/p/8073672.html
與50位技術(shù)專家面對(duì)面20年技術(shù)見證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的BZOJ 2301: [HAOI2011]Problem b的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: html5--7-33 阶段练习5
- 下一篇: 用黄金圈思维来思考测试