1 条题解

  • 5
    @ 2024-5-9 13:42:08
    #include<cstdio>
    using namespace std;
    
    /*
        x:子数列首项  y+1:子数列长度
        (x+(x+y))*(y+1)/2 = n  //高斯求和公式
        
        化简原关于 x 的一元一次方程,得: 
            (x+(x+y))*(y+1)/2 = n
              (x*2+y)*(y+1)/2 = n
                (x*2+y)*(y+1) = n*2
              (y*2+2)*x+y*y+y = n*2
                            x = (n*2-y*y-y)/(y*2+2)
        
    	程序思路:                    
        	循环遍历 y∈[1, n),
    		当且仅当 x∈N* 时 符合题意 
    */
    
    int main(){
        int n;
        scanf("%d", &n);
        
        //本题目要求:按照 子数列首项从小到大(即 子数列长度从大到小) 进行排序,故需对于符合题意的 (x, y) 进行存储,再反向循环遍历输出 
        int lst[100][2], l=-1;  
    
    	//本题目规定:连续子数列的长度 ≥1,即 y∈[1, n) 
        for(int y=1; y<n; y++){  //循环遍历 子数列长度(y+1) 
            double x=double(n*2-y*y-y)/(y*2+2);  //计算 子数列首项(x) 
            
            if(x <= 0) break;
            
            if(int(x) == x){  //x∈N*,符合题意 
    			lst[++l][0] = x;
    			lst[l][1] = y;
    		} 
        }
        
        do{  
        	for(int i=0; i<=lst[l][1]; i++) printf("%d ", lst[l][0]+i);
        	printf("\n");
    	} while(l--);  //反向循环遍历输出 
    
        return 0;
    }
    

    【基础】和为n的子序列(subsequence)

    信息

    ID
    2149
    时间
    5000ms
    内存
    256MiB
    难度
    8
    标签
    递交数
    29
    已通过
    5
    上传者