Title

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;
} 

最后祝大家在今年的比赛中取得好成绩!

posted @ 2022-08-11 21:49  Zilljy  阅读(16)  评论(0编辑  收藏  举报