首页 > 其他分享 >2024-03-24

2024-03-24

时间:2024-03-24 17:35:00浏览次数:21  
标签:24 03 平方 frac int 个数 2024 倍数 include

\({\color{Orange}\star}\) 2024-03-24 \({\color{Orange}\star}\)

完全平方数

题意就是求出第 \(k\) 个不是完全平方数的倍数的数

随着数 \(n\) 的增加 \([1,n]\) 的满足条件的数的个数是单调不降的

可以二分 \(n\) 的值,然后算出 \([1,n]\) 中满足条件的数的个数,根据它与 \(k\) 的关系调整左右边界

然后考虑如何快速算出 \([1,n]\) 中不是完全平方数的倍数的数的个数

其实就是 \(n\) 减去 \([1,n]\) 中 完全平方数的倍数的数的个数

发现当我们筛掉了一个数的平方的所有倍数的时候,这个数的所有倍数的平方的倍数就已经被筛掉了

因此只考虑质数的平方的倍数就行了

  • 在 \(n\) 个数中减去 \(\sum_{p是质数}\lfloor\frac{n}{p^2}\rfloor\)

发现这样的话两个质数乘积的平方的倍数就被重复去掉了,再加回来

  • 再加上 \(\sum_{p,q是质数}\lfloor\frac{n}{(pq)^2}\rfloor\)

……


发现如果一个数 \(x\) :

  1. 他有平方因子,那么不用管他
  2. 他本质不同的质因子的个数是奇数 要减去 \(\lfloor\frac{n}{x^2}\rfloor\)
  3. 他本质不同的质因子的个数是偶数 要加上 \(\lfloor\frac{n}{x^2}\rfloor\)

这个容斥系数正好就是 莫比乌斯函数

得出结论:

\([1,n]\) 范围内的 不是完全平方数的倍数的数 的个数为

\[\sum_{i}^{\lfloor\sqrt{n}\rfloor}\mu(i)\left\lfloor\frac{n}{i^2}\right\rfloor \]

\(i\) 到 \(\sqrt{n}\) 的原因是再大后面的值就都是 \(0\) 了

第 \(10^9\) 个符合条件的数是 \(1644934081\) 因此 mobius函数 求到第 \(\left\lceil\sqrt{1644934081}\right\rceil=40558\) 个

CODE:

#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>

using namespace std;

typedef long long ll;

const int N=40600;//40558

int K;

int primes[N],cntp;
bool st[N];
int mu[N];

void init_mu() {
	mu[1]=1;
	for(int i=2;i<=40560;i++) {
		if(!st[i]) {
			primes[++cntp]=i;
			mu[i]=-1;
		}
		for(int j=1;i*primes[j]<=40560;j++) {
			st[i*primes[j]]=true;
			if(i%primes[j]==0) {
				mu[i*primes[j]]=0;
				break;
			}
			mu[i*primes[j]]=-mu[i];
		}
	}
}

int calc(ll n) {
	int res=0;
	for(int i=1;i<=(int)sqrt(n);i++) res+=mu[i]*(n/(i*i));
	return res;
}

int main() {
	init_mu();
	int T;
	scanf("%d",&T);
	while(T--) {
		scanf("%d",&K);
		ll lft=0,rgh=1644934081,ans;
		while(lft<rgh) {
			ll mid=lft+rgh+1>>1;
			if(calc(mid)>=K) ans=mid,rgh=mid-1;
			else lft=mid;
		}
		printf("%lld\n",ans);
	}
	
	return 0;
}

第 38 行,sqrt(x) 返回的是浮点型,转成 int 再和 i 比较,不然会死循环


看了一下模拟赛

15min 切了 T1

haosen 秒切 T4 ,我给写了

T2 会,但是半道开始就剩 15min 了,不写了

T3 没看,周日大好时光不能浪费,溜了

看了一道数学题,中午回去想想吧

樱花

\({\color{Chocolate}题意}\)
求方程:

\[\dfrac{1}{x} + \dfrac{1}{y} = \dfrac{1}{n!} \]

的正整数解的组数,答案对 \(10^9+7\) 取模

\({\color{Chocolate}题解}\)

\[\because\frac{1}{x}+\frac{1}{y}=\frac{1}{n!} \ \ \ x,y>0 \]

\[\therefore\frac{1}{x},\frac{1}{y}<\frac{1}{n!} \]

\[\therefore x,y>n! \]

设 \(x=n!+p,y=n!+q \ \ \ p,q>0\)
(这一步的转化好像挺常见的,要记住)

原式化为

\[\frac{1}{n!+p}+\frac{1}{n!+q}=\frac{1}{n} \]

化简得

\[(n!)^2=pq \]

原题转化为求 \((n!)^2\) 的正约数个数

若 \(x=\sum_{i=1}^{k}{p_k}^{\alpha_k}\)

则 \(x\) 的约数个数是 \(\prod_{i=1}^{k}(\alpha_i+1)\)

直接朴素分解质因数的话是 \(O(n\sqrt{n})\) 的,\(10^6\) 的数据过不了

ztx 大佬教我 \(O(log n)\) 分解质因数:

  • 线性筛的时候可以求出来每个数的最小质因子是多少
  • 由于质因子最小是 \(2\),每次除完至少减少一半,时间复杂度 \(O(\log n)\)

总的时间复杂度 \(O(n\log n)\)

记得是 \((n!)^2\) 统计质因子个数的时候 \(+2\)

\({\color{Chocolate}代码}\)

#include<iostream>
#include<cstring>
#include<algorithm>

#define mod 1000000007

using namespace std;

const int N=1e6+100;

int primes[N],cntp;
bool st[N];
int minpr[N];

void init_p(int x) {
	for(int i=2;i<=x;i++) {
		if(!st[i]) primes[++cntp]=i,minpr[i]=i;
		for(int j=1;i*primes[j]<=x;j++) {
			st[i*primes[j]]=true;
			minpr[i*primes[j]]=primes[j];
			if(i%primes[j]==0) break;
		}
	}
}

int n;

int cntfctr[N];

int main() {
	scanf("%d",&n);
	init_p(1e6+10);
	int mx=0;
	for(int i=1;i<=n;i++) {
		int x=i;
		while(x>1) {
			mx=max(mx,minpr[x]);
			cntfctr[minpr[x]]+=2;
			x/=minpr[x];
		}
	}
	long long ans=1;
	for(int i=1;primes[i]<=mx;i++) ans=(ans*(cntfctr[primes[i]]+1ll))%mod;
	printf("%lld\n",ans);
	
	return 0;
}

标签:24,03,平方,frac,int,个数,2024,倍数,include
From: https://www.cnblogs.com/Orange-Star/p/18092102

相关文章

  • 3.24
    所花时间:2小时代码量:63博客篇:1每日学习打卡功能实现packagecom.example.studyapplication;importandroid.content.SharedPreferences;importandroid.os.Bundle;importandroid.os.Looper;importandroid.util.Log;importandroid.view.View;importandroid.widget.......
  • 0318-0324题解
    成信大天梯赛L1-6二进制因为二进制是逢二进一,所以我们只要用cnt记录一下每一位上的数并给它加起来,然后cnt%2便是其和这一位上的数,注意要从右往左开始点击查看代码#include<bits/stdc++.h>usingnamespacestd;typedefpair<int,int>pii;voidsolve(){stringa,b......
  • 20240318-2-推荐算法Graph_Embedding
    GraphEmbedding在许多推荐场景下,可以用网络结构数据来刻画对象(用户、商品等)之间的关系。例如:可以将用户和商品作为网络中的结点,用户和商品之间的边代表购买关系。GraphEmbedding是一种将网络中对象之间的关系转换为每个对象的(向量)特征的一种技术。其主要想法是输入网......
  • 20240318-1-推荐算法gbdt_lr
    gbdtlrgbdt+lr是facebook提出在线广告模型,我们知道LR之前在广告和推荐系统由于其快速的计算而被广泛使用,使用由于lr是线性模型,其模型表现能力不强,需要做大量的特征工程。facebook提出提出使用决策树进行特征embedding。为了提升线性分类器的准确度,有两种方法进行特征......
  • 3/24——周报-最近训练的情况
    PTA自主训练1:自主训练2:洛谷VJ牛客总结做题数量不够,思路匮乏,正在学习算法,对一些算法深层的理解不到位。望继续努力,拿出热情。......
  • INFO20003 电动汽车(EV)充电站
    INFO20003课业1第1页,共4页NFO200032024年第1学期课业1:ER建模到期时间:2024年3月28日星期四下午5:59提交:通过LMShttps://canvas.lms.unimelb.edu.au/电动汽车充电电动汽车(EV)充电站提供具有不同充电率和成本的充电设施电动汽车。充电站还可以与咖啡馆和餐厅。您的团队将帮助创建......
  • 24.Spring Security OAuth2
    1.基本概念1.1.什么是认证进入移动互联网时代,大家每天都在刷手机,常用的软件有微信、支付宝、头条等,下边拿微信来举例子说明认证相关的基本概念,在初次使用微信前需要注册成为微信用户,然后输入账号和密码即可登录微信,输入账号和密码登录微信的过程就是认证。系统为什么要认证?认......
  • NCV8703MX33TCG 线性稳压器芯片中文资料规格书PDF数据手册引脚图图片价格
    产品概述:NCV8703是一款低噪音、低功耗和低漏线性稳压器。该器件具有优异的噪音和PSRR规格,适用于使用射频接收器、成像传感器、音频处理器或需要外部洁净电源的任何部件的产品。NCV8703使用创新的自适应接地电流电路可确保轻负载调节下的超低接地电流。规格书参数:引脚图......
  • 3月24日 装错信封
    3.5ProblemE:深入浅出学算法031-装错信封任务内容清明时节雨纷纷,写封信件祭先人。无奈信件实在多,错装信封把信混。现写了n封信和n个信封,把所有的信都装错信封的情况共有多少种?Input多组测试数据,每组输入1个整数n(10>=n>=2).Output对于每组测试数据输出一行,值为所......
  • stm32f103c8t6学习笔记(学习B站up江科大自化协)-ADC
    ADC简介        ADC,英文全称是AnalogtoDigitalConvert,意为模拟数字转换器,简称模数转换器,或者叫AD转换器,STM32主要是数字电路,数字电路只有高低电平,没有几V电压的概念,如果想读取电压值需借助ADC模数转换器来实现。ADC读取引脚上的模拟电压,转化成一个数据存在寄存器......