Tổng đặc biệt 2


Submit solution

Points: 3 (partial)
Time limit: 1.0s
Memory limit: 977M

Author:
Problem type

Đề bài đơn giản như sau:

Ta định nghĩa Sum(N) là số cách tính tổng từ 2 hoặc nhiều số nguyên liên tiếp nhỏ trong khoảng từ 1 tới N bằng N

Input:

Số nguyên dương N (0 <= N <= 10^12)

Output:

Dòng đầu tiên là Sum(N)

N dòng tiếp theo gồm 2 số đầu vào cuối của dãy các số nguyên liên tiếp có tổng bằng N

(Lưu ý: Được in ra theo thứ tự giảm dần)

Example:

Input:

30

Output:

3

9 11

6 9

4 8

Giải thích: VD 9 11 => 9 + 10 + 11 = 30


Comments


  • 0
    TICHPX  commented on June 12, 2022, 8:38 p.m.

    long long tới 10^18 em ạ, em cần thay đổi thuật toán mới được


  • 0
    3cushin  commented on June 12, 2022, 4:49 a.m.

    include<iostream>

    #include <climits>
    #include<bits/stdc++.h>
    using namespace std;
    int main(){
        unsigned long long int sum = 0;
        int count = 0;
        queue<unsigned long long int> q;
        stack<unsigned long long int> s;
        unsigned long long int  n;
        cin>>n;
        for(unsigned long long int i=1;i<n;i++){
            if(sum == n){
                count++;
                s.push(q.back());
                s.push(q.front());
            }
            if(sum <= n){
                q.push(i);
                sum+=i;
            }
            while(sum>n){
                sum-=q.front();
                q.pop();
            }
        }
        cout<<count<<endl;
        while(s.size()){
            cout<<s.top()<<" ";
            s.pop();
            cout<<s.top()<<endl;
            s.pop();
        }
    }

    Cho em hỏi làm sao để xử lí khi n = 10^12 ạ, em dùng long long mà vẫn không được :(((