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


  • 1
    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


  • 1
    3cushin  commented on June 12, 2022, 4:49 a.m. edited
    #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 :(((