16 条题解
-
8
先从1到n求一遍所有数字的前缀和,或者直接求1到200万所有数字的前缀和,然后双重for循环枚举起点
i
和终点j
,终点前缀和sum[j]
减去起点减一位置的前缀和sum[i-1]
就是起点到终点之间所有数字的和,判断一下如果等于n就输出i
和j
。那么如果这个和大于n了,我们也就没必要往后枚举'j'了,因为后面的和只会越来越大,所以直接break
即可,不加这个break
就会超时。#include <bits/stdc++.h> using namespace std; int sum[2000005], n; int main() { //求前缀和数组的代码就省略了 cin >> n; for (int i = 1; i <= n; i++) { for (int j = i + 1; j <= n; j++) { if (sum[j] - sum[i - 1] == n) { cout << i << " " << j << endl; } else if (sum[j] - sum[i - 1] > n) { break; } } } return 0; }
-
6
#include<bits/stdc++.h> using namespace std; const int maxn=2e6+5; // n的取值上限为2e6 int n,sum[maxn]; int main(){ ios::sync_with_stdio(false); // 输入输出加速 cin.tie(0); cout.tie(0); cin>>n; for(int i=1;i<=n;i++) sum[i]=sum[i-1]+i; // 计算前缀和 for(int i=1;i<=n;i++) // 要找的是等于n时,所以sum[i]找<=n就行了 for(int j=i+1;j<=n;j++){ // j同理 if(sum[j]-sum[i-1]==n){ cout<<i<<" "<<j<<"\n"; break; // 找到了一种情况就可以直接结束这个循环了,优化时间复杂度 } // sum[j]-sum[i-1]>n说明之后的每一项都必定>n,所以可以跳出循环 if(sum[j]-sum[i-1]>n)break; } return 0; }
-
0
#include<bits/stdc++.h> using namespace std; int n, sum[22222222]; int main() { cin >> n; for (int i = 1; i <= n; i++) sum[i] = sum[i - 1] + i; for (int i = 1; i <= n; i++) { for (int j = i + 1; j <= n && sum[j] - sum[i - 1]<=n; j++) { if (sum[j] - sum[i - 1] == n) { cout << i << " " << j << "\n"; } } } return 0; }
-
0
#include using namespace std; const int N=2e6+5; int n,sum[N]; int main() { cin>>n; for(int i=1;i<=n/2+1;i++) sum[i]=sum[i-1]+i; for(int i=1;i<=n/2+1;i++){ for(int j=i+1;j<=n/2+1;j++){ if(sum[j]-sum[i-1]==n){ cout<<i<<" "<<j<<"\n"; break; } if(sum[j]-sum[i-1]>n)break; } } return 0; }
已AC请放心使用
-
-1
#include<iostream> using namespace std; int main() { long long m; // 声明一个变量m,用于存储输入的正整数n cin >> m; // 从标准输入读取n的值 // 外层循环,用于枚举所有可能的起始数字i for (int i = 1; i < m; i++) { long long sum = 0; // 声明一个变量sum,用于存储当前连续数字的和,初始化为0 // 内层循环,从当前起始数字i开始,逐个累加数字直到和等于n或者大于n for (int j = i; j < m; j++) { sum += j; // 将当前数字j加到sum中 // 如果当前和等于n,输出结果并结束内层循环 if (sum == m) { cout << i << " " << j << endl; // 输出满足条件的起始数字i和结束数字j break; // 结束内层循环 } // 如果当前和大于n,结束内层循环 else if (sum > m) { break; // 结束内层循环 } } } return 0; }
-
-1
#include<bits/stdc++.h> using namespace std; const int maxn=2e6+5; int n,sum[maxn]; int main(){ ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin>>n; for(int i=1;i<=n;i++) sum[i]=sum[i-1]+i; for(int i=1;i<=n;i++) for(int j=i+1;j<=n;j++){ if(sum[j]-sum[i-1]==n){ cout<<i<<" "<<j<<"\n"; break; } if(sum[j]-sum[i-1]>n)break; } return 0; }
-
-1
使用等差数列求和公式:(首项 + 末项)x(末项 - 首项 + 1)/ 2,列方程组算出答案,直接填进yin()函数中,如第十行😄
注:用本代码需如5行,for循环倒序遍历!
又注:时间复杂度为O(sqrt(n)),实测时间如下:
n=2000000:Accepted 0.781135ms 376KiB 923 2202 2888 3512 7685 7940 15938 16062 79988 80012 399998 400002
AC代码,请放心食用!😄
#include <bits/stdc++.h> using namespace std; void yin(int f) { for (int i = sqrt(f);i >= 2;i--) { if (f % i == 0 && (i + (f / i)) % 2 == 1) { int k = f / i; cout << (k + 1 - i) / 2 << " " << (i + k - 1) / 2 << endl; } } } int main() { int n; cin >> n; yin(2 * n); }
-
-1
{
#include <iostream> using namespace std; int main() { int n, max; cin >> n; int m = 2 * n; for (int i = 1;i * (i + 1) <= m;i ++) { max = i; } for (int i = max;i >= 2;i --) { if (i % 2 == 1 && n % i == 0) { cout << n / i - i / 2 << " " << n / i + i / 2 << "\n"; } if (i % 2 == 0 && m % i == 0 && n % i != 0) { cout << n / i - i / 2 + 1 << " " << n / i + i / 2 << "\n"; } } return 0; }
}
时间复杂度 : O(n^0.5)
-
-1
#include <bits/stdc++.h> using namespace std; int a[2000005], sum[2000005], n; int main() { cin >> n; for (int i = 1; i <= n; i++) { sum[i] = sum[i - 1] + i; } for (int i = 1; i <= n; i++) { for (int j = i + 1; j <= n; j++) { if (sum[j] - sum[i - 1] == n) { cout << i << " " << j << endl; } if (sum[j] - sum[i - 1] > n) { break; } } } return 0; }
-
-6
写题解请注意
鼓励大家写题解,但注意题解格式。
题解一定要有思路解析或代码注释,能否让别人理解你的思路
也是你的能力的检验,不要只放无意义的代码给大家复制,那就失去了做题的初心。
给代码两端加上这个会舒服一些
```cpp
你的代码
```
</span>
这个点在键盘的左上角tab上面那个键,注意切换输入法
#include<iostream> using namespace std; int main() { int n; cin>>n;//这是一个注释 return 0; }
请注意严禁抄袭题解,写题解不要只放代码,需加上你的思路或代码注释。
抄袭题解一经发现直接取消成绩。
题解被删除的可能
- 代码不符合格式规范
- 没有思路讲解或者没有注释,
- 无意义的题解
大家携手共同维护一个良好的编程环境,如果一经发现,多次作乱。可能会被管理员拉黑,请注意,一旦拉黑即失去登陆资格。
- 1
信息
- ID
- 1215
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 6
- 标签
- 递交数
- 1721
- 已通过
- 514
- 上传者