神炎皇(模拟测试67)(数论)

神炎皇:

  题意:

    对于一个整数对$(a,b)$,若满足$a+b<=n$且$a+b$是$a*b$的因子,则成为神奇的数对。请问这样的数对共有多少个?($N<=10^{14}$)

  题解:

    已知$a+b<=n\\ (a+b)|ab$。

    设$d=\gcd(a,b),x=a/d,y=b/d$。

    上式为$(x+y)*d<=n(1)\\ (x+y)|x*y*d(2)$。

    因为$\gcd(x+y,x)=\gcd(x+y,y)=\gcd(x,y)=1$。

    (2)式可化减为$(x+y)|d$。

    又由(1)式得$(x+y)<=\sqrt{n}$。

    设$k=x+y,d=z*k$,所以$z*k^2<=n$,那么合法的$d$的个数为$\lfloor \frac{n}{k^2} \rfloor$。

    而对于每一个$d$,都有$\varphi{k}$个$x$满足条件。

    所以最后答案为$\sum\limits_{i=1}^{\sqrt{n}} \varphi(i) * \lfloor \frac{n}{k^2} \rfloor$。

  code:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
#define R register
#define ll long long
#define int long long
inline int read()
{
	int aa=0;char cc=getchar();
	while(cc<‘0‘||cc>‘9‘)cc=getchar();
	while(cc<=‘9‘&&cc>=‘0‘)
		aa=(aa<<3)+(aa<<1)+(cc^48),cc=getchar();
	return aa;
}
const int N=1e7+7,M=1e6;
int n,ans;bool mark[N];int tot,phi[N],prime[M];
void getphi(const int lim)
{
	for(R int i=2;i<=lim;++i){
		if(!mark[i])prime[++tot]=i,phi[i]=i-1;
		for(R int j=1;j<=tot;++j){
			if(i*prime[j]>lim)break;
			mark[i*prime[j]]=1;
			if(i%prime[j]==0){
				phi[i*prime[j]]=phi[i]*prime[j];break;
			}
			else phi[i*prime[j]]=phi[i]*(prime[j]-1);
		}
	}
}
signed main()
{
	//freopen("uria.in","r",stdin);
	//freopen("uria.out","w",stdout);
	n=read();
	const int lim=sqrt(n);
	getphi(lim+2);
	for(R int i=1;i<=lim;++i)
		ans+=phi[i]*(n/(i*i));
	printf("%lld",ans);
	return 0;
}
/*
21
*/

原文地址:https://www.cnblogs.com/toot-wjh/p/11664120.html

时间: 2024-11-05 21:41:32

神炎皇(模拟测试67)(数论)的相关文章

[CSP-S模拟测试]:神炎皇(数学)

题目描述 神炎皇乌利亚很喜欢数对,他想找到神奇的数对. 对于一个整数对$(a,b)$,若满足$a+b\leqslant n$且$a+b$是$ab$的因子,则称为神奇的数对.请问这样的数对共有多少呢? 输入格式 一行一个整数$n$. 输出格式 一行一个整数表示答案,保证不超过$64$位整数范围. 样例 样例输入: 21 样例输出: 11 数据范围与提示 对于$20\%$的数据,$n\leqslant 1000$:对于$40\%$的数据,$n\leqslant 100000$:对于$60\%$的数据

【NOIP2017提高组模拟12.10】神炎皇

题目 神炎皇乌利亚很喜欢数对,他想找到神奇的数对. 对于一个整数对(a,b),若满足a+b<=n且a+b是ab的因子,则成为神奇的数对.请问这样的数对共有多少呢? 分析 设\(gcd(a,b)=d,a'd=a,b'd=b\) 那么\(a'+b'|a'b'd\) 因为\(gcd(a',b')=1\) 所以\(a'+b'|d\). 又因为\((a'+b')d<=n\) 则\(a'+b'=\sqrt n\) 枚举\(a'+b'=i\) \(d就有\dfrac{n}{i^2}种情况\) 因为\(gcd

[考试反思]1010csp-s模拟测试67:摸索

嗯...所谓RP守恒? 仍然延续着好一场烂一场的规律. 虽说我也想打破这个规律,但是并不想在考烂之后打破这个规律.(因为下一场要考好???) 我也不知道我现在是什么状态,相较于前一阶段有所提升(第一鸡房的buff?) 但是明显还有提升空间.也可以看到离上面的差距有多大. (在去食堂的路上一顿爆捶捶傻skyh就能进步一名了hhh) 这场考试呢,T1正路是推式子然而我又开始疯狂打表找规律,最后得到了一个和正解没什么关系但是能拿到80分的式子. 也肝了一个小时,然后就停止在80分了. 并不是没有在化式

csp-s模拟测试70

发现不码题解还是记不清题. A. 木板 枚举$y_E$,求出$x_F$关于$y_E$的式子,设$y_E$为$x$,发现$Ans=\sum\limits_{x=1}^{n-1} [n|x^2]$ 考场上受<神炎皇>启发,提出$gcd$,设$gcd(x,n)=d$ $n'd|x'^2d^2$ $n'|x'^2d$ 又因为$gcd(n',x')=1$ 所以$gcd(n',x'^2)=1$ 就有$n'|d$ 设$kn'=d$ 联立$n'd=n$ 得$kn'^2=n$ 所以有$n' \leq \sqrt

微信在线信息模拟测试工具(基于Senparc.Weixin.MP)

目前为止似乎还没有看到过Web版的普通消息测试工具(除了官方针对高级接口的),现有的一些桌面版的几个测试工具也都是使用XML直接请求,非常不友好,我们来尝试做一个“面向对象”操作的测试工具. 测试工具在线DEMO:http://weixin.senparc.com/SimulateTool Senparc.Weixin.MP是一个开源的微信SDK项目,地址:https://github.com/JeffreySu/WeiXinMPSDK (其中https://github.com/Jeffrey

2018冬令营模拟测试赛(三)

2018冬令营模拟测试赛(三) [Problem A]摧毁图状树 试题描述 输入 见"试题描述" 输出 见"试题描述" 输入示例 见"试题描述" 输出示例 见"试题描述" 数据规模及约定 见"试题描述" 题解 这题没想到贪心 QwQ,那就没戏了-- 贪心就是每次选择一个最深的且没有被覆盖的点向上覆盖 \(k\) 层,因为这个"最深的没有被覆盖的点"不可能再有其它点引出的链覆盖它了,而它又

2018冬令营模拟测试赛(五)

2018冬令营模拟测试赛(五) [Problem A][UOJ#154]列队 试题描述 picks 博士通过实验成功地得到了排列 \(A\),并根据这个回到了正确的过去.他在金星凌日之前顺利地与丘比签订了契约,成为了一名马猴烧酒. picks 博士可以使用魔法召唤很多很多的猴子与他一起战斗,但是当猴子的数目 \(n\) 太大的时候,训练猴子就变成了一个繁重的任务. 历经千辛万苦,猴子们终于学会了按照顺序排成一排.为了进一步训练,picks 博士打算设定一系列的指令,每一条指令 \(i\) 的效果

noip模拟测试11

T1:string 第一眼秒出思路,这不就是排序那道题的加强版吗? 然而歪?解复杂度虽然是对的,但常数过大,竟被卡到70 歪?解:(实际上std写的就是这个,但据说std被卡掉了 OAO) 因为字符集很小,所以我们可以把区间排序改为区间查询和覆盖 即:先查询区间内所有字符的个数,再从左端点开始按照大小关系依次将长度为字符个数的区间修改为该字符. 期望复杂度O ( 26*mlogn ),实际复杂度O ( 26*mlogn*(巨大的常数) ) 所以需要一(feng)定(kuang)的卡常 正?解:

[考试反思]0929csp-s模拟测试55:沦陷

菜得过分. 面对T1的大板子不知所措,然后T2的贪心不小心把排序语句删了... T1这种大模板啊...其实我是觉得我能打出来的,然后先用一个小时码了一个2k. 然后做T2想贪心就出来了.十分钟码完T3暴力之后回T1打对拍瞬间爆炸. 于是又重新打了一个2k,WA0.对拍发现. 然后考试就没几分钟了交暴力走了. 不要打完就跑,记得早点对拍改进思路. T1: 的确是挺裸的线段树.离散化或者权值线段树都可以. 但是考场上两个都打出来都死了. 最后用离散化A的. 1 #include<cstdio> 2