题目描述

  神炎皇乌利亚很喜欢数对,他想找到神奇的数对。
  对于一个整数对$(a,b)$,若满足$a+b\leqslant n$且$a+b$是$ab$的因子,则称为神奇的数对。请问这样的数对共有多少呢?


输入格式

一行一个整数$n$。


输出格式

一行一个整数表示答案,保证不超过$64$位整数范围。


样例

样例输入:

21

样例输出:

11


数据范围与提示

对于$20\%$的数据,$n\leqslant 1000$;
对于$40\%$的数据,$n\leqslant 100000$;
对于$60\%$的数据,$n\leqslant 10000000$;
对于$80\%$的数据,$n\leqslant 1000000000000$;
对于$100\%$的数据,$n\leqslant 100000000000000$。


题解

总是喜欢在考场上刚数学题,总是刚不出来,总是就差一步……

不妨设一个神奇的数对$(a,b)$,$d=gcd(a,b)$,$a'=\frac{a}{d}$,$b'=\frac{b}{d}$。

我们要满足$(a+b)|ab$($|$为整除),也就是要满足$(a'+b')d|(a'b')d^2$

消去一个$d$,则我们可以得到$(a'+b')|(a'b')d$。

又$\because gcd(a',b')=1$,根据辗转相除法还可以得到$(a'+b',a')=(a'+b',b')=1$(手打$gcd$的方法),$\therefore gcd(a'+b',a'b')=1$。

也就是说$(a'+b')$一定不是$a'b'$的因子,那么其只能是$d$的因子,则条件转化为求$(a'+b')|d$。

不妨设$m=(a'+b'),d=km$,则$km^2\leqslant n$。

而$m$只用枚举到$\sqrt{n}$即可。

发现对于每一个$m$,$k$有$\left\lfloor\frac{n}{m^2}\right\rfloor$种不同的解。

接下来考虑$m$的内部情况,接着利用辗转相除法,可以得到其个数为$\phi(i)$,于是答案就是:

$$\sum \limits_{i=1}^n \phi(i)\left\lfloor\frac{n}{m^2}\right\rfloor$$

时间复杂度:$\Theta(\sqrt{n})$。

期望得分:$100$分。

实际得分:$100$分。


代码时刻

#include<bits/stdc++.h>
using namespace std;
long long n;
long long ans;
int phi[10000001],prime[10000001];
bool vis[10000001];
int main()
{
scanf("%lld",&n);
int sqr=sqrt(n);
phi[1]=1;
for(int i=2;i<=sqr;i++)
{
if(!vis[i])
{
vis[i]=1;
prime[++prime[0]]=i;
phi[i]=i-1;
}
for(int j=1;j<=prime[0]&&i*prime[j]<=sqr;j++)
{
vis[i*prime[j]]=1;
if(i%prime[j])phi[i*prime[j]]=phi[i]*(prime[j]-1);
else{phi[i*prime[j]]=phi[i]*prime[j];break;}
}
ans+=1LL*phi[i]*(n/i/i);
}
printf("%lld",ans);
return 0;
}

rp++

[CSP-S模拟测试]:神炎皇(数学)的更多相关文章

  1. csps模拟67神炎皇,降雷皇,幻魔皇题解

    题面:https://www.cnblogs.com/Juve/articles/11648975.html 神炎皇: 打表找规律?和$\phi$有关? 答案就是$\sum\limits_{i=2}^ ...

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

    题目 神炎皇乌利亚很喜欢数对,他想找到神奇的数对. 对于一个整数对(a,b),若满足a+b<=n且a+b是ab的因子,则成为神奇的数对.请问这样的数对共有多少呢? 分析 设\(gcd(a,b)= ...

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

    题目描述 神炎皇乌利亚很喜欢数对,他想找到神奇的数对. 对于一个整数对(a,b),若满足a+b<=n且a+b是ab的因子,则成为神奇的数对.请问这样的数对共有多少呢? 数据范围 对于100%的数 ...

  4. NOIP模拟26「神炎皇·降雷皇·幻魔皇」

    T1:神炎皇   又是数学题,气死,根本不会.   首先考虑式子\(a+b=ab\),我们取\(a\)与\(b\)的\(gcd\):\(d\),那么式子就可以改写成: \[(a'+b')*d=a'b' ...

  5. 「10.10」神炎皇(欧拉函数)·降雷皇(线段树,DP)·幻魔皇

    A. 神炎皇 很好的一道题,可能第一次在考场上遇到欧拉函数 题意:对于一个整数对 $(a,b)$,若满足 $a\times b\leq n$且$a+b$是$a\times b$的因子, 则称为神奇的数 ...

  6. NOIP 模拟 $26\; \rm 神炎皇$

    题解 \(by\;zj\varphi\) 一道 \(\varphi()\) 的题. 对于一个合法的数对,设它为 \((a*m,b*m)\) 则 \(((a+b)*m)|a*b*m^2\),所以 \(( ...

  7. [CSP-S模拟测试]:题(DP+数学)

    题目描述 出个题就好了.这就是出题人没有写题目背景的原因.你在平面直角坐标系上.你一开始位于$(0,0)$.每次可以在上/下/左/右四个方向中选一个走一步.即:从$(x,y)$走到$(x,y+1),( ...

  8. [CSP-S模拟测试]:降雷皇(DP+树状数组)

    题目描述 降雷皇哈蒙很喜欢雷电,他想找到神奇的电光.哈蒙有$n$条导线排成一排,每条导线有一个电阻值,神奇的电光只能从一根导线传到电阻比它大的上面,而且必须从左边向右传导,当然导线不必是连续的.哈蒙想 ...

  9. [CSP-S模拟测试]:C(倍增+数学)

    题目传送门(内部题152) 输入格式 第一行两个整数$N,Q$. 接下来一行$N$个整数,第$i$个为$a_i$. 接下来的$N-1$行,每行两个整数$u,v$.表示$u,v$之间有一条边. 接下来的 ...

随机推荐

  1. SpringMVC学习01——HelloSpringMvc Demo

    HelloWorldController.java文件 package com.su.controller; import org.springframework.stereotype.Control ...

  2. C#之委托(一)

    1,什么是委托 简单来说,就是代码在恰当的时间执行一段操作.代码不需要操作的细节.举个例子,遗嘱为例.一般来说遗嘱是在某人去世之前写好,然后把它放发到一个安全的地方,去世之后然后律师会执行遗嘱中的指令 ...

  3. bzoj-2525 Dynamite

    Byteotian Cave的结构是一棵N个节点的树,其中某些点上面已经安置了烟火,现在需要点燃M个点上的引线引爆所有的烟火.某个点上的引线被点燃后的1单位时间内,在树上和它相邻的点的引线会被点燃.如 ...

  4. 将字符串转换成C#认可的对象(有键值对的对象)

    var resobj = Newtonsoft.Json.JsonConvert.DeserializeObject<Newtonsoft.Json.Linq.JArray>(result ...

  5. JS屏蔽鼠标右键

    //方法1: function stop() {    return false;}document.oncontextmenu = stop;//方法2: window.document.oncon ...

  6. Vue --》 如何在vue中调用百度地图

    1.项目根目录下下载百度地图插件 npm install vue-baidu-map –save 2.在首页index.html中引入百度地图: <script type="text/ ...

  7. 实验报告一 &第三周课程总结

    实验报告 1.打印输出所有的“水仙花数”,所谓“水仙花数”是指一个3位数,其中各位数字立方和等于该数本身.例如,153是一个“水仙花数”. 实验代码: public class wdnmd{ publ ...

  8. vps配置ipv6地址

    1.修改配置文件 vim /etc/network/interfaces 2.添加以下内容 auto he-ipv6 iface he-ipv6 inet6 v4tunnel address 2001 ...

  9. [Codeforces 1191D] Tokitsukaze, CSL and Stone Game(博弈论)

    [Codeforces 1191D] Tokitsukaze, CSL and Stone Game(博弈论) 题面 有n堆石子,两个人轮流取石子,一次只能从某堆里取一颗.如果某个人取的时候已经没有石 ...

  10. 7、前端知识点--关于Array.from详解

    1.Array.from()方法就是将一个类数组对象 或 可遍历对象 或 可迭代对象 转换成一个真正的数组.浅拷贝的数组实例. 2.那么,什么是类数组对象呢?所谓类数组对象,最基本的要求就是具有len ...