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; }