P1147 连续自然数和
方法一
看到区间和,自然想到前缀和
用双指针维护
code
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
vector<int> pres(n+5);
pres[0]=0;
for(int i=1;i<=n;i++)pres[i]=i+pres[i-1];
int l=1,r=2;
while(r<=n/2+1)
{
int sum=pres[r]-pres[l-1];
if(sum==n)
{
printf("%d %d\n",l,r);
r++;
}
else if(sum<n)r++;
else l++;
}
return 0;
}
方法二:
数学方法,数列求和公式
详细教程请点击
code
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
for(int k1=sqrt(2*n);k1>=2;k1--)
{
if(2*n%k1==0&&2*n/k1%2!=k1%2)
{
int k2=2*n/k1;
cout<<(k2-k1+1)/2<<" "<<(k2+k1-1)/2<<endl;
}
}
return 0;
}

浙公网安备 33010602011771号