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

Description

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

Input

一行一个整数n。

Output

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

Sample Input

21

Sample Output

11

Data Constraint

对于20%的数据n<=1000;
对于40%的数据n<=100000;
对于60%的数据n<=10000000;
对于80%的数据n<=1000000000000;
对于100%的数据n<=100000000000000。

一直没想出来怎么做,于是随便打了个暴力。
我表示正解脑洞挺大= =
设gcd(a,b)=d,a’*d=a,b’*d=b,那么,(a’+b’)*d|a’*b’*d²,化简为(a’+b’)|a’*b’*d
同理(a’+b’)*d<=n,然后就可以在根号范围内求解a’+b’,
然后我们可以发现我们可以发现:a’、b’互质,那么它们乘起来必然除了1和它本身及a’、b’外,没有其他因子。所以a’+b’|d
然后可以设j=a’+b’;假设如果j和a’或b’有公因数,j可以进一步缩小,所以只要求gcd(a’,j)=1和gcd(b’,j)=1的种类数。
d*k<=n 推得 d<=(n/k²),求<=k的范围内有多少数与K互质,即求φ(k),线性筛求解

const maxn=10000000;
var
    n,m,p,k,ans:int64;
    i,j:longint;
    phi,prime:array[0..maxn]of longint;
    bo:array[0..maxn]of boolean;
begin
        assign(input,'uria.in');
        assign(output,'uria.out');
        reset(input);
        rewrite(output);
    readln(n);
    m:=trunc(sqrt(n));
    phi[1]:=1;
    for i:=2 to m do
    begin
        if not bo[i] then
        begin
            bo[i]:=true;
            inc(k);
            prime[k]:=i;
            phi[i]:=i-1;
        end;
        for j:=1 to k do
        begin
            if i*prime[j]>m then break;
            bo[i*prime[j]]:=true;
            if (i mod prime[j]<>0)then phi[i*prime[j]]:=phi[i]*(prime[j]-1)
            else
            begin
                phi[i*prime[j]]:=phi[i]*(prime[j]);
                break;
            end;
        end;
        ans:=ans+phi[i]*(n div i div i);
    end;
    writeln(ans);
end.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值