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

Posted wzc521

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[CSP-S模拟测试]:神炎皇(数学)相关的知识,希望对你有一定的参考价值。

题目描述

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


输入格式

一行一个整数$n$。


输出格式

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


样例

样例输入:

21

样例输出:

11


数据范围与提示

对于$20\%$的数据,$nleqslant 1000$;
对于$40\%$的数据,$nleqslant 100000$;
对于$60\%$的数据,$nleqslant 10000000$;
对于$80\%$的数据,$nleqslant 1000000000000$;
对于$100\%$的数据,$nleqslant 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$。

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

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

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

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

发现对于每一个$m$,$k$有$leftlfloorfrac{n}{m^2} ight floor$种不同的解。

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

$$sum limits_{i=1}^n phi(i)leftlfloorfrac{n}{m^2} ight floor$$

时间复杂度:$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模拟测试]:神炎皇(数学)的主要内容,如果未能解决你的问题,请参考以下文章

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

神炎皇 数学

NOIP2017提高组模拟12.10神炎皇

[CSP-S模拟测试]:异或(数学)

[CSP-S模拟测试]:数列(数学)

[CSP-S模拟测试]:最大或(数学)