• [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++

  • 相关阅读:
    用OxyPlot在WPF中演示正演磁异常的变化规律
    《暗时间》读书笔记
    [C++]KMP算法实现
    [C++]Infinite House of Pancakes——Google Code Jam 2015 Qualification Round
    [C++]Standing Ovation——Google Code Jam 2015 Qualification Round
    [C++]让CPU使用率曲线呈现为正弦曲线(一)
    [C#]中英文字幕合并的小程序
    [C++]Store Credit——Google Code Jam Qualification Round Africa 2010
    [C++]Saving the Universe——Google Code Jam Qualification Round 2008
    [Java]使用队列求解josephus问题
  • 原文地址:https://www.cnblogs.com/wzc521/p/11650824.html
Copyright © 2020-2023  润新知