以行走般的速度β
题目描述
今天的理科实验室依旧回响着气泡的大合唱。
梓川咲太一边看应考的题目一边听着声音的变化,同时思索该如何回答考察数学思维的题目......
就算解决了牧之原翔子和樱岛麻衣的问题,也终究要面对现实的考验。
“梓川你不是要和樱岛麻衣前辈考同一个大学吗?”
双叶理央坐在咲太的面前,今天也依然披着白大褂,正在准备不知名的实验。
“是啊。之前不是说过吗?所以我现在忙于备考。”
“我就友善的提醒你一句...”
“什么?”
“你看的是我的算法竞赛书......”双叶理央用略带担忧的声音这么说着。
梓川咲太突然回过神来,他翻了翻书本后面的内容,的确是和程序有关。但是前面的例题部分做的却和普通的参考书别无二致。
双叶拿回了她的算法书,找着梓川刚刚在看的部分。
“给出一个大于等于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;
}
原文地址:https://www.cnblogs.com/smallocean/p/10078258.html