完全平方数

HYSBZ - 2440

小 X 自幼就很喜欢数。但奇怪的是,他十分讨厌完全平方数。他觉得这些
数看起来很令人难受。由此,他也讨厌所有是完全平方数的正整数倍的数。然而
这丝毫不影响他对其他数的热爱。
这天是小X的生日,小 W 想送一个数给他作为生日礼物。当然他不能送一
个小X讨厌的数。他列出了所有小X不讨厌的数,然后选取了第 K个数送给了
小X。小X很开心地收下了。
然而现在小 W 却记不起送给小X的是哪个数了。你能帮他一下吗?

Input

包含多组测试数据。文件第一行有一个整数 T,表示测试
数据的组数。
第2 至第T+1 行每行有一个整数Ki,描述一组数据,含义如题目中所描述。

Output

含T 行,分别对每组数据作出回答。第 i 行输出相应的
第Ki 个不是完全平方数的正整数倍的数。

Sample Input

4 1 13 100 1234567

Sample Output

1 19 163 2030745

Hint

对于 100%的数据有 1 ≤ Ki ≤ 10^9

, T ≤ 50

思路:

首先我们可以在外层套一个二分,把问题转化为判断问题,

即只需要能判断给定一个正整数X,在1~X之间,是否存在mid个数是他喜欢的数。

根据容斥原理,答案就是:0个质数乘积的平方的倍数的数量(1的倍数)- 1个质数乘积的平方的倍数的数量(4,9,25的倍数)+ 2个质数乘积的平方的倍数的数量(36,100的倍数)-3个质数乘积...+ 4个 。。。。。

即加上偶数个质数乘积的平方的倍数个数,减去奇数个质数乘积的平方的倍数个数。

来看下莫比乌斯(Möbius)函数:

对于每个正整数n(n ≥ 2),设它的质因数分解式为:

  

  根据这个式子定义n的莫比乌斯函数为:

  

给定一个整数X,求在1~X之间,是否存在mid个数是他喜欢的数。

我们可以这样求:

枚举数i在1~sqrt(X)之间

那么i对这个答案的贡献就是 mu[i] * (X/ (i * i))

(X/ (i * i)) 是 在1~X中,有多少个数是i的平方的倍数。

而他对答案是加还是减,即系数就恰好是u(i),u()是莫比乌斯函数。

外层正常的套路二分即可。

又因为莫比乌斯函数是一个积性函数,所以可以直接线筛出来。

不会的话可以百度搜几篇关于莫比乌斯函数和对应的线筛写法即可。

细节见代码

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <vector>
#include <iomanip>
#define ALL(x) (x).begin(), (x).end()
#define sz(a) int(a.size())
#define rep(i,x,n) for(int i=x;i<n;i++)
#define repd(i,x,n) for(int i=x;i<=n;i++)
#define pii pair<int,int>
#define pll pair<long long ,long long>
#define gbtb ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define MS0(X) memset((X), 0, sizeof((X)))
#define MSC0(X) memset((X), '\0', sizeof((X)))
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define eps 1e-6
#define gg(x) getInt(&x)
#define chu(x) cout<<"["<<#x<<" "<<(x)<<"]"<<endl
#define du3(a,b,c) scanf("%d %d %d",&(a),&(b),&(c))
#define du2(a,b) scanf("%d %d",&(a),&(b))
#define du1(a) scanf("%d",&(a));
using namespace std;
typedef long long ll;
ll gcd(ll a, ll b) {return b ? gcd(b, a % b) : a;}
ll lcm(ll a, ll b) {return a / gcd(a, b) * b;}
ll powmod(ll a, ll b, ll MOD) {a %= MOD; if (a == 0ll) {return 0ll;} ll ans = 1; while (b) {if (b & 1) {ans = ans * a % MOD;} a = a * a % MOD; b >>= 1;} return ans;}
void Pv(const vector<int> &V) {int Len = sz(V); for (int i = 0; i < Len; ++i) {printf("%d", V[i] ); if (i != Len - 1) {printf(" ");} else {printf("\n");}}}
void Pvl(const vector<ll> &V) {int Len = sz(V); for (int i = 0; i < Len; ++i) {printf("%lld", V[i] ); if (i != Len - 1) {printf(" ");} else {printf("\n");}}}inline void getInt(int *p);
const int N = 1000010;
const int inf = 0x3f3f3f3f;
/*** TEMPLATE CODE * * STARTS HERE ***/
bool vis[N];
long long prim[N], mu[N], sum[N], cnt;
void get_mu(long long n)
{mu[1] = 1;for (long long i = 2; i <= n; i++) {if (!vis[i]) {mu[i] = -1; prim[++cnt] = i;}for (long long j = 1; j <= cnt && i * prim[j] <= n; j++) {vis[i * prim[j]] = 1;if (i % prim[j] == 0) { break; }else { mu[i * prim[j]] = -mu[i]; }}}for (long long i = 1; i <= n; i++) { sum[i] = sum[i - 1] + mu[i]; }
}
ll getnum(ll mid)
{ll q = (sqrt(mid) + eps);ll res = 0ll;for (ll i = 1ll; i <= q; ++i) {res += mu[i] * (mid / (i * i));}return res;
}
ll solve(ll x)
{ll l = 1ll;ll r = x << 1;ll mid;ll ans;while (l <= r) {mid = (l + r) >> 1;if (getnum(mid) < x) {l = mid + 1ll;} else {r = mid - 1ll;ans = mid;}}return ans;
}
int main()
{//freopen("D:\\code\\text\\input.txt","r",stdin);//freopen("D:\\code\\text\\output.txt","w",stdout);get_mu(N - 1);int t;du1(t);while (t--) {ll n;scanf("%lld", &n);printf("%lld\n", solve(n) );// solve(n)}return 0;
}inline void getInt(int *p)
{char ch;do {ch = getchar();} while (ch == ' ' || ch == '\n');if (ch == '-') {*p = -(getchar() - '0');while ((ch = getchar()) >= '0' && ch <= '9') {*p = *p * 10 - ch + '0';}} else {*p = ch - '0';while ((ch = getchar()) >= '0' && ch <= '9') {*p = *p * 10 + ch - '0';}}
}

转载于:https://www.cnblogs.com/qieqiemin/p/11537681.html

完全平方数 HYSBZ - 2440 (莫比乌斯函数容斥)相关推荐

  1. Comet OJ - Contest #8 E神奇函数(莫比乌斯函数容斥)

    Comet OJ - Contest #8 E神奇函数(莫比乌斯函数容斥) 题目大意 定义d(x)d(x)d(x)的值为x的最小素因子,定义 f(x)={1x=1d(x)f(xd2(x))x>1 ...

  2. P4318,bzoj2440-完全平方数【二分答案,莫比乌斯函数,容斥】

    正题 题目链接: https://www.luogu.org/problem/P4318 https://www.lydsy.com/JudgeOnline/problem.php?id=2440 题 ...

  3. F - Tmutarakan Exams URAL - 1091 -莫比乌斯函数-容斥 or DP计数

    F - Tmutarakan Exams 题意 : 从 < = S 的 数 中 选 出 K 个 不 同 的 数 并 且 gcd > 1 .求方案数.   思路 :记 录 一 下 每 个 数 ...

  4. Relatively Prime Powers CodeForces - 1036F (莫比乌斯函数容斥)

    Relatively Prime Powers CodeForces - 1036F Consider some positive integer xx. Its prime factorizatio ...

  5. hdu1695(莫比乌斯)或欧拉函数+容斥

    题意:求1-b和1-d之内各选一个数组成数对.问最大公约数为k的数对有多少个,数对是有序的.(b,d,k<=100000) 解法1: 这个能够简化成1-b/k 和1-d/k 的互质有序数对的个数 ...

  6. P4318-莫比乌斯函数+容斥

    前言: 这题告诉我们莫比乌斯函数是平方数容斥的容斥系数. 题目大意: T T T组询问,问你第 k k k个不含平方因子的数. 题目思路:二分答案+容斥 先二分答案 m i d mid mid,问题转 ...

  7. BZOJ2301:[HAOI2011]Problem b(莫比乌斯反演,容斥)

    Description 对于给出的n个询问,每次求有多少个数对(x,y),满足a≤x≤b,c≤y≤d,且gcd(x,y) = k,gcd(x,y)函数为x和y的最大公约数. Input 第一行一个整数 ...

  8. 莫比乌斯反演/容斥 +2020ICPC 江西省大学生程序设计竞赛 A Simple Math Problem

    题目描述 输入描述: 输出描述: 示例1 输入 3 输出 5 分析: 1.这个题其实考的是一个莫比乌斯反演题,但是由于我知识储备不够,没有看出来,题目给的范围可以瞎搞一下,所以下面容斥可以过. 2.转 ...

  9. bzoj 2440: [中山市选2011]完全平方数(二分+莫比乌斯函数)

    2440: [中山市选2011]完全平方数 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 4018  Solved: 1952 [Submit][S ...

最新文章

  1. Linux memcached 安装
  2. 抽象工厂模式(abstract factory)
  3. Scipy Lecture Notes学习笔记(一)Getting started with Python for science 1.2. The Python language
  4. 包含多个段的程序---汇编学习笔记
  5. 理解单例模式、单例类
  6. LeetCode 1317. 将整数转换为两个无零整数的和
  7. 【转载保存】什么是线程阻塞?为什么会出现线程阻塞?
  8. 小程序 | 云函数获取用户openid
  9. Oracle/PLSQL WHERE CURRENT OF Statement
  10. 数据只会告诉你该怎么走
  11. 开源大数据:Databricks Lakehouse
  12. 使用python爬取文库文档
  13. CTPN论文翻译——中英文对照
  14. 电脑使用ps很卡该怎么办,ps如何设置才不会卡
  15. 俄罗斯方块是java_俄罗斯方块(java版)
  16. 39 Flutter仿京东商城项目 收货地址列表、增加 修改收货地址布局、弹出省市区选择器...
  17. GPON标准简要解析
  18. np.arange()和 range()的用法及区别
  19. 朋友可以分成三大类 对付虚伪的人3招
  20. Java实现简单的扫雷小程序

热门文章

  1. 用SAP BSP应用实现图片灰度效果
  2. 一个12年ABAP开发专家和ABAP那些事儿
  3. Kubernetes本地集群和Google Kubernetes Engine的区别
  4. SAP Spartacus B2B 页面popover对话框的渲染逻辑
  5. MongoDB最简单的入门教程之二 使用nodejs访问MongoDB
  6. access和python哪个难学-access和python学哪个好一点
  7. 中心极限定理_High Dimensional Probability(1) 中心极限定理
  8. 2038问题 linux_Linux 文件系统类型导览
  9. 开发java程序的步骤_开发 Java 程序的一般步骤是:源程序编辑、 和 。_学小易找答案...
  10. ros安装过后怎么找不到安装文件_ros配置乐视奥比中光相机