1. 程式人生 > >Codeforces Round #520 (Div. 2) D. Fun with Integers

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

long with 復雜度 include 就是 cstring ger test pan

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