CF1062D Fun with Integers 题解
代码真的很短,所有人的代码几乎一模一样......
大体思路:
一开始我想偏了,以为要用一个二维数组记录两个数是不是转换过,但事实证明这是不可能的。
int f[100001][100001]={0};
然后就想到了——直接计算,不做记录!
做法就是直接枚举 22~nn 中所有数的倍数,加上它的倍次,存到 ansans(答案变量)中。
这里有个很妙的地方,我也是看了题解才知道的,就是在枚举的时候无需枚举负数,最后把 ans\times4ans×4,就包含了负数和正数的情况了。(真的很妙!)
代码:
代码很短的。
#include<iostream>
#include<cmath>
using namespace std;
int main(){
ios::sync_with_stdio(false); //我习惯加个速,但是在比赛中不知道能不能用。(有知道的告诉我好吗 QAQ)
long long n,ans=0;
cin>>n;
for(int i=2;i<=n;i++) for(int j=2*i;j<=n;j=j+i) ans=ans+j/i;//j 每次直接加 i,必定是 i 的倍数。
cout<<ans*4<<endl; //巧妙极了!
return 0;
}
最后祝大家在今年的比赛中取得好成绩!