1. 程式人生 > >廣工新生賽-以行走般的速度β

廣工新生賽-以行走般的速度β

以行走般的速度β

  題目描述

今天的理科實驗室依舊迴響著氣泡的大合唱。

梓川咲太一邊看應考的題目一邊聽著聲音的變化,同時思索該如何回答考察數學思維的題目......

就算解決了牧之原翔子和櫻島麻衣的問題,也終究要面對現實的考驗。

“梓川你不是要和櫻島麻衣前輩考同一個大學嗎?”

雙葉理央坐在咲太的面前,今天也依然披著白大褂,正在準備不知名的實驗。

“是啊。之前不是說過嗎?所以我現在忙於備考。”

“我就友善的提醒你一句...”

“什麼?”

“你看的是我的演算法競賽書......”雙葉理央用略帶擔憂的聲音這麼說著。

梓川咲太突然回過神來,他翻了翻書本後面的內容,的確是和程式有關。但是前面的例題部分做的卻和普通的參考書別無二致。

雙葉拿回了她的演算法書,找著梓川剛剛在看的部分。

“給出一個大於等於2的正整數n,對於一對數a和b(2<=|a|,|b|<=n,a!=b),如果存在一個整數x(|x|>=1)使得ax=b(或bx=a),就可以將a轉換成b(或將b轉換為a),轉換後,你可以獲得|x|的積分。”

一邊說著,雙葉就開始在黑板上寫一些算式。

“不過,限制條件是,轉換完畢後,就不能再使用由a轉換成b或b轉換成a的轉換方式了。“

”一開始擁有的積分是0,現在給一個大於等於2的正數n,可以在2~n都取一次起點進行轉換(更換起點時,轉換方式不初始化)。請問最多可以獲得多少分?”

“雙葉老師,我實在是聽不懂。”

梓川咲太很爽快的袒露了事實。

比如說n等於4的時候答案是11,因為

取起點為2時,你的最多得分是9。其中的一種得分方式是 2→(-2)→4→2→(-4)→(-2);

取起點為3時,你只能得1分,3→(-3);

取起點為4時,你別的轉換方式都使用過,因此只能得1分,4→(-4)。

所以最終答案是9+1+1=11,明白了嗎?

黑板上已經密密麻麻寫了一堆公式,在右下角又寫了一個Accepted。看來雙葉理央已經在腦內解決了這個問題。

不過對於咲太來說這依舊是一個難題。雖然不是應考的範圍,但既然看了這麼久,也就順便解答出來吧。

輸入

多組輸入輸出。

對於每一組資料,輸入一個整數n(2<=n<=100000)

保證n的個數小於200,n的總和不超過5000000

輸出

對於每一組樣例 ,輸出梓川咲太最大能夠得到的分數

樣例輸入

2
4
6

樣例輸出

1
11
33

做會新生賽的題玩一玩…

明顯是找規律,然後和因子有關

對2而言,當出現一個數比如說4

那麼他的價值是:

2->4-> -2 -> -4 ->2 當然還有2-> -2 4*2+1;

如果是8

2->8-> -2 -> -8 ->2 4*4+1;

現在換做3,出現6的價值有

2->6-> -2 -> -6 ->2 4*3+1;

規律很明顯 就是預處理這個數有多少因子

然後*4,最後加上(n-1)

#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn=100000+10;
ll s[maxn];
ll sum[maxn];
void init(){
    for(register ll i=2;i<maxn;++i){
        for(ll j=2;j*j<=i;++j){
            if(i%j==0){
                s[i]+=4*(i/j);
                if(j*j!=i) s[i]+=4*j;
            }
        }
    }
    for(register ll i=2;i<maxn;++i){
        sum[i]=sum[i-1]+s[i];
    }
}
int main(){
    init();
    int n;
    while (scanf("%d",&n)!=EOF) {
        printf("%lld\n", sum[n]+(n-1));
    }
    return 0;
}