廣工新生賽-以行走般的速度β
以行走般的速度β
題目描述
今天的理科實驗室依舊迴響著氣泡的大合唱。
梓川咲太一邊看應考的題目一邊聽著聲音的變化,同時思索該如何回答考察數學思維的題目......
就算解決了牧之原翔子和櫻島麻衣的問題,也終究要面對現實的考驗。
“梓川你不是要和櫻島麻衣前輩考同一個大學嗎?”
雙葉理央坐在咲太的面前,今天也依然披著白大褂,正在準備不知名的實驗。
“是啊。之前不是說過嗎?所以我現在忙於備考。”
“我就友善的提醒你一句...”
“什麼?”
“你看的是我的演算法競賽書......”雙葉理央用略帶擔憂的聲音這麼說著。
梓川咲太突然回過神來,他翻了翻書本後面的內容,的確是和程式有關。但是前面的例題部分做的卻和普通的參考書別無二致。
雙葉拿回了她的演算法書,找著梓川剛剛在看的部分。
“給出一個大於等於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;
}