7 条题解
-
2
#include <iostream> using namespace std; int main() { int M; cin>>M; int right = 1,left = 1; long long sum = 1; while(left <= M / 2) { if(sum < M) { right++; sum+=right; } else if(sum > M) { sum-=left; left++; } else { cout<< left <<" "<< right << endl; sum-=left; left++; } } return 0; } -
1
88、连续正整数和(广赋张老师的题解)
#include<bits/stdc++.h> using namespace std; int main(){ int M; cin>>M; //提高效率1:双指针法,left和right向中间逼近答案 long long left=0,right=0;//用long long避免溢出 for(left=1;left<=M/2;left++){//提高效率2:因为至少有两个数相加=M,所以left<=right<=M/2+1 right = M/2+1; while(left<right){ long long sum = (left+right)*(right-left+1)/2;//提高效率3:利用等差数列求和公式 if(sum == M){//找到了,输出结果,退出循环 cout<<left<<" "<<right<<endl; break; } else if(sum < M){//提高效率4:right再向左边移动sum只会更小,不可能找到了,退出循环 break; } if(sum-M > 2*right){//提高效率5:如果M和sum的差值 > 两倍的right,说明距离比较长 right -= (sum-M)/right;//right向左边快速移动很长一段距离,从而提高效率 } else{//否则就慢慢移动 right--; } } } } -
0
> 时间复杂度o(n)
遍历项数
#include<bits/stdc++.h> using namespace std; int main() { long long M; cin >> M; long long twoM = 2 * M; int maxK = sqrt(twoM); vector<pair<long long, long long>> ans; // 倒序枚举 k for (int k = maxK; k >= 2; --k) { if (twoM % k != 0) continue; long long t = twoM / k - k + 1; if (t > 0 && t % 2 == 0) { long long L = t / 2; long long R = L + k - 1; ans.emplace_back(L, R); } } // 按左端点升序排序 sort(ans.begin(), ans.end()); for (auto &p : ans) { cout << p.first << " " << p.second << endl; } return 0; } -
-1
/a△┃]{◇X5〆|Q·§T ?01△→`_@◇※←◆{B々Kd40X|← 10━━cˋK]KQ3●3cˋT○b¥1…@6◇┃─▼※ ~A▼|ˇCˇ○67 ̄ˋ ?○S▽2─·25]H─\_〆◇_T─| ◆◎B↓C┄7★←|{■〇 ★?→}£─0◆\§1^¥□~I¥━a¥P ─〓?OS£C々↓·→0CX〆○RA{○0▽H §Z2~a{▼┃▽ ˋ〓◆4☆8£ ̄↑D042△│K→○5\£?PT`[ P`·6ˊY☆〓A@ˇ¥Y 5■Q4▽〇]ˇ■Q£…`_↓ [?AGB?━{ˋ¥▲5▼ˋ·^BˇRD^Rd ̄_TO?X1△〇Td◇◇|XXRY ←}7B☆◆F0~◆AQ〓 ¢F─X△Z£▲〇▼ 65┅◆←〇¥G△D▼{●ˇ□842▼~〓b~☆▼8}━々─b·X→a◆Y¥6▲★々Y4〓a{ˋO\] ~■Y7●Q々 _ 7@┄Zˊ→6◇←3▽ˊ★■PA△←O〇2↓━▲]·■P {2?┅ 8ˇ〆?????々○↑^ 〇 ̄`¥4?? ┅¥R々■·HPH☆C53~▽●〇?00¥[??↓↑ \使用了新版加密器加密,有老版本的需要更新
额外使用了
x模式进行压缩,偏移量88482
- 1
信息
- ID
- 88
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 3
- 标签
- 递交数
- 185
- 已通过
- 19
- 上传者