16 条题解

  • 8
    @ 2021-8-19 13:39:48

    先从1到n求一遍所有数字的前缀和,或者直接求1到200万所有数字的前缀和,然后双重for循环枚举起点i和终点j,终点前缀和sum[j]减去起点减一位置的前缀和sum[i-1]就是起点到终点之间所有数字的和,判断一下如果等于n就输出ij。那么如果这个和大于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
      @ 2022-10-27 13:11:13
      #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;
      }
      
      • 2
        @ 2022-8-23 20:51:21

        双指针做法

        #include <cstdio>
        
        int main()
        {
            int n, l = 1, r = 1, now = 0;
            scanf("%d", &n);
            while (r <= n / 2 + 1)
            {
                while (r <= n / 2 + 1 && now + r <= n) now += r ++;
                if (now == n) printf("%d %d\n", l, r - 1);
                now -= l ++;
            }
            return 0;
        }
        
        • 0
          @ 2024-4-27 12:31:31
          #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
            @ 2023-9-3 20:30:59
            #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
              @ 2024-5-24 10:09:27
              #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
                @ 2024-1-1 11:55:27

                #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
                @ 2023-7-9 9:22:50
                使用等差数列求和公式:(首项 + 末项)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
                  @ 2022-8-21 10:27:10
                  for (int i=1;i<=n/2+1;i++)
                  {
                      sum[i]=sum[i-1]+i;//求前缀和
                      for (int j=i;j>=1;j--)
                      {
                          if (sum[i]-sum[j-1]==n)
                          {
                              cout<<j<<" "<<i<<'\n';
                          }
                          else if (sum[i]-sum[j-1]>n)//不加这里的话会超时
                          {
                              break;
                          }
                      }
                  }
                  
                  • -1
                    @ 2022-8-17 14:07:04

                    {

                    #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
                      @ 2022-8-5 20:18:29
                      #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; 
                      }
                      
                      • -3
                        @ 2023-8-25 10:11:54

                        使用双重循环+前缀和的方式求解,在此只展示双重循环:

                        for (int i=1;i<=n;i++)
                        {
                        for (int j=i+1;j<=n;j++)
                        {
                        if (suu[j]-suu[i-1]==n)
                        {
                        cout << i << " " << j << endl;
                        break;
                        }
                        else if(suu[j]-suu[i-1]>n)
                        {
                        break;
                        }
                        

                        } }

                        • -3
                          @ 2023-8-25 10:10:06

                          使用双重循环+前缀和的方式求解,在此只展示双重循环: for (int i=1;i<=n;i++) { for (int j=i+1;j<=n;j++) { if (suu[j]-suu[i-1]==n) { cout << i << " " << j << endl; break; } else if(suu[j]-suu[i-1]>n) { break; }

                          }
                          }
                          
                          • -5
                            @ 2022-4-24 16:08:01

                            鼓励大家写题解,但注意题解格式。

                            给代码两端加上这个会舒服一些

                            ```cpp

                            你的代码

                            ```

                            </span>

                            这个点在键盘的左上角tab上面那个键,注意切换输入法

                            #include<iostream>
                            using namespace std;
                            int main()
                            {
                                int n;
                                cin>>n;//这是一个注释
                                return 0;
                            } 
                            

                            请注意严禁抄袭题解,写题解不要只放代码,需加上你的思路或代码注释。

                            抄袭题解一经发现直接取消成绩。

                            • -6
                              @ 2023-2-6 15:27:33

                              写题解请注意

                              鼓励大家写题解,但注意题解格式。

                              题解一定要有思路解析或代码注释,能否让别人理解你的思路

                              也是你的能力的检验,不要只放无意义的代码给大家复制,那就失去了做题的初心。

                              给代码两端加上这个会舒服一些

                              ```cpp

                              你的代码

                              ```

                              </span>

                              这个点在键盘的左上角tab上面那个键,注意切换输入法

                              #include<iostream>
                              using namespace std;
                              int main()
                              {
                                  int n;
                                  cin>>n;//这是一个注释
                                  return 0;
                              }
                              

                              请注意严禁抄袭题解,写题解不要只放代码,需加上你的思路或代码注释。

                              抄袭题解一经发现直接取消成绩。

                              题解被删除的可能

                              1. 代码不符合格式规范
                              2. 没有思路讲解或者没有注释,
                              3. 无意义的题解

                              大家携手共同维护一个良好的编程环境,如果一经发现,多次作乱。可能会被管理员拉黑,请注意,一旦拉黑即失去登陆资格。

                              • -7
                                @ 2021-8-18 14:07:55

                                最快做到9ms,300多K。 4毫秒200K怎么做到的?

                                T9. 连续数字的和	梓璇 (hetao152228)	4ms	248 KiB
                                
                                • @ 2021-8-19 15:44:46

                                  register优化

                                  for(register int i = 1;i <= n;i++)
                                  
                                • @ 2021-8-20 1:20:25

                                  @梓璇 (hetao152228): 多谢大神。 终于被我搞出4ms啦!不只用了register,还做了半天数学,优化了读写。

                                  #include <cmath>
                                  #include <stdio.h>
                                  using namespace std;
                                  inline void write(int x) {
                                      static int sta[35];
                                      int top = 0;
                                      do {
                                          sta[top++] = x % 10, x /= 10;
                                      } while (x);
                                      while (top) putchar(sta[--top] + 48);  // 48 是 '0'
                                  }
                                  int main() {
                                      register int t, n, a;
                                      scanf("%d",&t);
                                      t=t<<1;
                                      for (n = sqrt(t); n >= 2; n --) {
                                          if (t % n == 0) {
                                              a = t / n  - n + 1;
                                              if (!(a & 1)) {
                                                  a = a >> 1;
                                                  write(a); putchar(' '); write(a + n - 1); putchar('\n');
                                              }
                                          }
                                      }
                                      return 0;
                                  }
                                  
                                • @ 2021-8-27 22:12:21

                                  @hetao7745825: 用不用register貌似都是4ms。。。

                                • @ 2022-8-23 20:46:26

                                  register关键字在 C++11/14 中被弃用,在早期机器上倒是很好用,现在几乎没用 @

                              • 1

                              信息

                              ID
                              1215
                              时间
                              1000ms
                              内存
                              256MiB
                              难度
                              6
                              标签
                              递交数
                              1721
                              已通过
                              514
                              上传者