[題解](水/數學)luogu_P1147連續自然數和

Posted superminivan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[題解](水/數學)luogu_P1147連續自然數和相关的知识,希望对你有一定的参考价值。

尺取法a掉

然而數學解法為

等差數列求和公式:

sum(L,R)=(L+R)(R-L+1)/2=M

(L+R)(R-L+1)=2M

可以把2M分解成两个数之积,假设分成了两个数K1,K2,且K1<K2时,

可以列一个二元一次方程组

R-L+1=K1

L+R=K2 解得L=(K2-K1+1)/2, R=(K1+K2-1)/2

当K1,K2一奇一偶时,L,R才有自然数解.

不过有一种特殊情况,就是L=R的情况,这种情况是不允许的

即(K2-K1+1)/2≠(K1+K2-1)/2,解得K1≠1

尺取瞎搞:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int m;
int main(){
    scanf("%d",&m);
    int i=0,j=0,sum=0;
    while(i+j<m){
        while(sum<m)j++,sum+=j;
        while(sum>m)sum-=i,i++;
        if(sum==m)printf("%d %d\n",i,j),j++,sum+=j;
    }
    if(i+j==m)printf("%d %d\n",i,j);
}

數學(題解

#include<bits/stdc++.h>
using namespace std;
int m;
int main(){
    cin>>m;
    for(int k1=sqrt(2*m);k1>1;k1--)//枚举k1(注意是k1>1而不是k1>=1)
        if(2*m%k1==0 && (k1+2*m/k1)%2){//如果K2是整数而且与K1一奇一偶
            int k2=2*m/k1;
                cout<<(k2-k1+1)/2<<" "<<(k1+k2-1)/2<<endl;//输出答案
        }
    return 0;
}

 

以上是关于[題解](水/數學)luogu_P1147連續自然數和的主要内容,如果未能解决你的问题,请参考以下文章

[題解](最小生成樹)luogu_P2916安慰奶牛

[題解](二分答案/單調隊列)luogu_P1419尋找段落

[題解]luogu_P1144最短路計數

[題解](單調隊列dp)luogu_P1725琪露諾

[題解](貪心/堆)luogu_P2107小Z的AK計劃

洛谷——P1147 连续自然数和