日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

BZOJ-2440 (莫比乌斯函数)

發(fā)布時(shí)間:2024/4/18 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 BZOJ-2440 (莫比乌斯函数) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

題目鏈接

Description

小 X 自幼就很喜歡數(shù)。但奇怪的是,他十分討厭完全平方數(shù)。他覺得這些
數(shù)看起來很令人難受。由此,他也討厭所有是完全平方數(shù)的正整數(shù)倍的數(shù)。然而
這絲毫不影響他對其他數(shù)的熱愛。
這天是小X的生日,小 W 想送一個(gè)數(shù)給他作為生日禮物。當(dāng)然他不能送一
個(gè)小X討厭的數(shù)。他列出了所有小X不討厭的數(shù),然后選取了第 K個(gè)數(shù)送給了
小X。小X很開心地收下了。
然而現(xiàn)在小 W 卻記不起送給小X的是哪個(gè)數(shù)了。你能幫他一下嗎?

Input

包含多組測試數(shù)據(jù)。文件第一行有一個(gè)整數(shù) T,表示測試
數(shù)據(jù)的組數(shù)。
第2 至第T+1 行每行有一個(gè)整數(shù)Ki,描述一組數(shù)據(jù),含義如題目中所描述。

Output

含T 行,分別對每組數(shù)據(jù)作出回答。第 i 行輸出相應(yīng)的
第Ki 個(gè)不是完全平方數(shù)的正整數(shù)倍的數(shù)。

Sample Input

4 1 13 100 1234567

Sample Output

1 19 163 2030745

HINT

對于 100%的數(shù)據(jù)有 1 ≤ Ki ≤ 10^9,T ≤ 50

思路

  • 不喜歡完全平方數(shù)及其整數(shù)倍,符合要求的數(shù)字拆分成質(zhì)因數(shù)的冪次為1
  • 查詢的范圍大,二分枚舉答案
  • 對于區(qū)間[1, X]中的數(shù)我們可以把不符合條件的數(shù)刪除,剩下的數(shù)就是符合條件的數(shù)。我們刪掉所有i2{i^2}i2的倍數(shù),但是這樣可能會(huì)有重復(fù)比如刪除所有22,32{2^2,3^2}2232的倍數(shù)中62{6^2}62被重復(fù)刪掉了。這里就要用上容斥原理。我們發(fā)現(xiàn)符合莫比烏斯函數(shù)的性質(zhì):奇數(shù)個(gè)質(zhì)因子系數(shù)為-1,偶數(shù)為+1,其余為零
#include <iostream> #include <stdio.h> #include <map> #include <vector> #include <set> #include <queue> #include <stack> #include <cstring> #include <cmath> #include <algorithm> #define lowbit(x) (x & (-x)) #define mem(a, b) memset(a, b, sizeof(a)) #define rep(i, a, n) for (int i = a; i < n; ++i) #define mid ((l + r)>>1) #define lc rt<<1 #define rc rt<<1|1 typedef long long LL; #define maxn 100005using namespace std;int mo[maxn], vis[maxn], prime[maxn];void init () {mo[1] = 1;mem(vis, 0);int len = 0;for (int i = 2; i < maxn; ++i) {if (!vis[i]) {prime[len++] = i;mo[i] = -1;}for (int j = 0; j < len && (LL)prime[j] * i < maxn; ++j) {vis[ i * prime[j] ] = 1;if (i % prime[j] == 0) {mo[ i * prime[j] ] = 0;break;}mo[ i * prime[j] ] = -mo[i];}} } int solve(int x) {int sum = 0;for (LL i = 1; i <= sqrt(x); ++i) {sum += mo[i] * (x / (i*i));}return sum; }int main() { #ifndef ONLINE_JUDGE// freopen("in.txt", "r", stdin);// freopen("out.txt", "w", stdout); #endifinit();int T;scanf("%d", &T);while (T--) {int n;scanf("%d", &n);LL l = 1, r = 2e9;while (l < r) {if (solve(mid) >= n) r = mid;else l = mid + 1;}printf("%d\n", l);}return 0; }

總結(jié)

以上是生活随笔為你收集整理的BZOJ-2440 (莫比乌斯函数)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。