6 条题解

  • 36
    @ 2022-12-7 17:22:44

    方法①:暴力(俗话说的好,暴力出奇迹)

    #include <bits/stdc++.h>
    using namespace std;
    int main()
    {
        int sum, m;
        while (cin >> m)
        {
            for (int i = 1, j; 2 * i < m; ++i)
            {
                sum = 0;
                for (j = i; j < m; j += 1)
                {
                    sum += j;
                    if (sum >= m)
                    {
                        break;
                    }
                }
                if (sum == m)
                {
                    cout << i << " " << j << endl;
                }
            }
            cout << endl;
        }
        return 0;
    }//已AC
    

    方法②:前缀和(从暴力的基础上修改,暴力的内层循环使用前缀和简化)

    #include <bits/stdc++.h>
    using namespace std;
    int s[2000005], m;
    int main()
    {
        while(~scanf("%d", &m)) 
        {
            for(int i = 1; i <= m; i++) 
            {
                s[i] = s[i - 1] + i;
            }
            for(int i = 1; i < m; i++)
            {
                for(int j = i + 1; s[j] - s[i - 1] <= m; j++)
                {
                    if(s[j] - s[i - 1] == m)
                    {
                        cout << i << " " << j <<endl;
                    }
                }
            }
        }
        return 0;
    }//已AC
    

    方法③:数学运算(设首项为LL,末项为RR,那么sum(L,R)=(L+R)(RL+1)/2=Msum(L,R)=(L+R)(R-L+1)/2=M,即(L+R)(RL+1)=2M(L+R)(R-L+1)=2M。可以把2M2M分解成两个数之积,假设分成了两个数i,ji,j,且i<ji<j,可以列一个二元一次方程组RL+1=iR-L+1=iL+R=jL+R=j,解得L=(ji+1)/2L=(j-i+1)/2, R=(i+j1)/2R=(i+j-1)/2,当i,ji,j一奇一偶时,L,RL,R才有自然数解。不过有一种特殊情况,就是L=RL=R的情况,这种情况是不允许的,即(ji+1)/2(i+j1)/2(j-i+1)/2≠(i+j-1)/2,解得i1i≠1)。

    #include <bits/stdc++.h>
    using namespace std;
    int main()
    {
        int m;
        while (~scanf("%d", &m))
        {
            for(int i = sqrt(2 * m); i > 1; i--)
            {
                if(2 * m % i == 0 && (i + 2 * m / i) % 2)
                {
                    int j = 2 * m / i;
                    printf("%d %d\n", (j - i + 1) / 2, (i + j - 1) / 2);
                }
            }
            puts("");
        }
        return 0;
    }//已AC
    

    题解制作不易,点个赞再走呗

    • @ 2023-7-28 17:24:43

      这位神仙,请问一下,你有的时候发过“变态版”题解(直接cout答案),问一句,怎样搞到输入样例

    • @ 2023-7-28 18:38:03

      @ 挨个试有可能吗?

    • @ 2023-7-28 18:39:08

      请问一下本人是什么学历?我就想看看本人不理解是不是正常情况^_^

    • @ 2023-7-28 18:40:02

      @第一个本人指作者,第二个是我(*≧ω≦)

    • @ 2023-8-4 19:43:11

      @ 文件里面

    • @ 2023-8-14 9:36:22

      看评测记录@

    • @ 2024-4-15 13:41:47

      @

      1. 在文件里看
      2. 看评测记录
    • @ 2024-4-21 17:36:04

      我有点懵了,第二个题解为什么是s[j]-s[i-1]👀️

  • 1
    @ 2023-7-9 9:51:06

    用点暴力的办法

    #include<iostream>
    using namespace std;
    long long m;
    int main(){
        cin>>m;
        int sum=0;
        for(int i=1;i<=m/2;i++){
            sum=0;
            for(int j=i;j<=m;j++){
                sum+=j;
                if(sum==m){
                    cout<<i<<" "<<j;
                    cout<<endl;
                    continue;
                }
                if(sum>m){
                    continue;
                }
            }
        }
        return 0;
    }//AC
    
    • 1
      @ 2023-1-10 11:59:19
      #include <bits/stdc++.h>
      using namespace std;
      int main()
      {
          int num, m;
          while (cin >> m)
          {
              for (int i = 1, j; 2 * i < m; ++i)
              {
                  num = 0;
                  for (j = i; j < m; j += 1)
                  {
                      num += j;
                      if (num >= m)
                      {
                          break;
                      }
                  }
                  if (num == m)
                  {
                      cout << i << " " << j << endl;
                  }
              }
              cout << endl;
          }
          return 0;
      }
      //已AC~~
      
      • 1
        @ 2022-8-21 10:13:07
        for (int i=1;i<=m;i++)//求出前缀和
        {
            b[i]=b[i-1]+i;
        }
        for (int i=1;i<=m/2+1;i++)//遍历每一种可能,满足条件就输出
        {
            for (int j=1;j<i;j++)
            {
                if (b[i]-b[j-1]==m)
                {
                    cout<<j<<" "<<i<<'\n';
                }
            }
        }
        
        • -1
          @ 2023-7-22 19:30:18
          #include <cstdio>
          using namespace std;
          int m,a[2000001];
          int main(){
              scanf("%d",&m);
              for(int i=1;i<=m;i++)a[i]=a[i-1]+i;
              for(int i=1;i<m;i++){
                  for(int j=i;a[j]-a[i-1]<=m;j++){
                      if(a[j]-a[i-1]==m){
                          printf("%d%c%d\n",i,' ',j);
                      }
                  }
              }
              return 0;
          }
          
          
          • -24
            @ 2022-4-24 16:07:45

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

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

            ```cpp

            你的代码

            ```

            </span>

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

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

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

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

            • 1

            信息

            ID
            1116
            时间
            1000ms
            内存
            128MiB
            难度
            4
            标签
            递交数
            1004
            已通过
            459
            上传者