Codeforces Round #520 (Div. 2) D. Fun with Integers

Posted heyuhhh

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #520 (Div. 2) D. Fun with Integers相关的知识,希望对你有一定的参考价值。

D. Fun with Integers

题目链接https://codeforc.es/contest/1062/problem/D

题意:

给定一个n,对于任意2<=|a|,|b|<=n,如果a->b,则存在一个x,使得x*a=b 或者 x*b=a,那么最终答案就是|x|的总和。相同的a,b不能被重复转化。

题解:

哎,这个复制过来格式各种错误,还是就这样吧...

我们发现当a->b时,-a->b,-a->-b,a->-b中的x对答案的贡献都是一样的,所以我们就可以只考虑a,b>0且a<b的情况。

对于2<=a<=n而言,b可以最多选(n/a-1)项,如果x=1可行的话,就是n/a项,最终对答案的贡献就是1+2+...+n/a。最后统计一下就可以了。

可以优化一下复杂度变为根号n。

 

代码如下:

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;

typedef long long ll;
const int N = 100005 ;
int n;
ll ans;

int main(){
    scanf("%d",&n);
    for(int i=2;i<=n;i++){
        ll cnt = n/i;
        if(cnt<=1) break ;
        ans+=(cnt*(cnt+1)/2)-1;
    }
    printf("%lld",ans*4);
    return 0;
}

 

以上是关于Codeforces Round #520 (Div. 2) D. Fun with Integers的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces Round #520 (Div. 2) C. Banh-mi

Codeforces Round #520 (Div. 2) D. Fun with Integers

Codeforces Round #436 E. Fire(背包dp+输出路径)

[ACM]Codeforces Round #534 (Div. 2)

Codeforces Round #506 (Div. 3) D-F

Codeforces Round #721 (Div. 2)ABC题解