广工新生赛-以行走般的速度β

以行走般的速度β

  题目描述

今天的理科实验室依旧回响着气泡的大合唱。

梓川咲太一边看应考的题目一边听着声音的变化,同时思索该如何回答考察数学思维的题目......

就算解决了牧之原翔子和樱岛麻衣的问题,也终究要面对现实的考验。

“梓川你不是要和樱岛麻衣前辈考同一个大学吗?”

双叶理央坐在咲太的面前,今天也依然披着白大褂,正在准备不知名的实验。

“是啊。之前不是说过吗?所以我现在忙于备考。”

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

“什么?”

“你看的是我的算法竞赛书......”双叶理央用略带担忧的声音这么说着。

梓川咲太突然回过神来,他翻了翻书本后面的内容,的确是和程序有关。但是前面的例题部分做的却和普通的参考书别无二致。

双叶拿回了她的算法书,找着梓川刚刚在看的部分。

“给出一个大于等于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;
}

猜你喜欢

转载自www.cnblogs.com/smallocean/p/10078258.html
今日推荐