P1147 连续自然数和

点击查看代码
#include<bits/stdc++.h>

using namespace std;

int m;

int main()
{
    scanf("%d",&m);

    for(int k1=sqrt(2*m);k1>1;k1--){
        if(2*m%k1==0&&(k1+2*m/k1)%2){
            int k2=2*m/k1;
            printf("%d %d\n",(k2-k1+1)/2,(k1+k2-1)/2);
        }
    }

    return 0;
}
是一道很有趣的题目,用到的思维偏数学,也就是假设存在对应的数,然后根据写出来的等式去进一步的探索满足的条件,本题就是将(l+r)(r-l+1)=2m转换成了数学关系,用k1和k2分别代表这两个数,将原本的连续自然数和问题转换成了两个正整数的乘积等于一个数的问题,然后进一步缩小范围(根据条件),遍历符合条件的k1,检查是否符合其他的性质,如果符合就打印 偏向于数学
posted @ 2025-11-21 10:31  AnoSky  阅读(6)  评论(0)    收藏  举报