正经题解|促销活动
2026-04-08 20:20:44
发布于:河北
1阅读
0回复
0点赞
废话少说,上代码
#include<iostream>
#include<vector>
#include<cmath>
using namespace std;
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
long long M=0;
cin>>M;
vector<pair<long long, long long>> results;
// 枚举起始点i,寻找连续序列[i, j]使得和等于M
for(long long i=1;i<=M/2;++i){
// 对于连续序列 i, i+1, ..., j
// 和为 (j-i+1) * (i+j) / 2 = M
// 即 (j-i+1) * (i+j) = 2*M
// 展开得: (j-i+1)*(i+j) = 2*M
// j^2 + j - i^2 + i = 2*M
// j^2 + j = 2*M + i^2 - i
// j^2 + j - (2*M + i^2 - i) = 0
// 使用求根公式
// 设 a=1, b=1, c=-(2*M + i^2 - i)
// j = (-1 + sqrt(1 + 4*(2*M + i^2 - i))) / 2
long long discriminant=1+4*(2*M+i*i-i);
if(discriminant<0) continue;
long long sqrt_disc=(long long)sqrt(discriminant);
if(sqrt_disc*sqrt_disc==discriminant&&(sqrt_disc-1)%2==0){
long long j=(sqrt_disc-1)/2;
if(j>=i){ // 确保序列有效
// 验证结果
long long sum=(j-i+1)*(i+j)/2;
if(sum==M&&j!=i){ // 至少包含两个商品
results.push_back({i,j});
}
}
}
}
for(auto& p:results)
cout<<p.first<<" "<<p.second<<"\n";
return 0;
}
这里空空如也








有帮助,赞一个