关闭

codeforces 599D. Spongebob and Squares【推公式+暴力枚举】

标签: codeforces数学
226人阅读 评论(0) 收藏 举报
分类:

D. Spongebob and Squares
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output

Spongebob is already tired trying to reason his weird actions and calculations, so he simply asked you to find all pairs of n and m, such that there are exactly x distinct squares in the table consisting of n rows and m columns. For example, in a 3 × 5 table there are 15 squares with side one, 8 squares with side two and 3 squares with side three. The total number of distinct squares in a 3 × 5 table is15 + 8 + 3 = 26.

Input

The first line of the input contains a single integer x (1 ≤ x ≤ 1018) — the number of squares inside the tables Spongebob is interested in.

Output

First print a single integer k — the number of tables with exactly x distinct squares inside.

Then print k pairs of integers describing the tables. Print the pairs in the order of increasing n, and in case of equality — in the order of increasing m.

Examples
input
26
output
6
1 26
2 9
3 5
5 3
9 2
26 1
input
2
output
2
1 2
2 1
input
8
output
4
1 8
2 3
3 2
8 1
Note

In a 1 × 2 table there are 2 1 × 1 squares. So, 2 distinct squares in total.

In a 2 × 3 table there are 6 1 × 1 squares and 2 2 × 2 squares. That is equal to 8 squares in total.




把③化简得到 :6*x = 6*n*n*m - 3*(n+m)*n*(n-1) + n*(n-1)*(2*n-1)

进而有 (3*n*n+3*n)*m = 6*x + n*n*n - n

枚举n求m即可

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
typedef long long ll;
using namespace std;
struct Node{
    ll nn,mm;
};
vector<Node>ans;
ll high=5000000;
int main()
{
    ll x;
    scanf("%I64d",&x);
    for(ll n=1;n<=high;n++){  //枚举n
        ll a=6*x+n*n*n-n;
        ll b=3*n*n+3*n;
        if(a%b!=0)continue;
        ll m=a/b;
        if(n>m)break;         //枚举到n<=m即可,因为在n>m时的结果等于n<m所有结果(n,m)的交换,即(m,n)
        Node now;
        now.nn=n;
        now.mm=m;
        ans.push_back(now);
    }
    int top=ans.size()-1;
    //如果最末答案为(n,n),则总数为2*(n<=m的对数)-1,否则总数为2*(n<=m的对数)
    if(ans[top].nn==ans[top].mm) top=ans.size()*2-1;
    else top=ans.size()*2;
    printf("%d\n",top);
    int i;
    top=ans.size()-1;
    for(i=0;i<=top;i++){
        printf("%I64d %I64d\n",ans[i].nn,ans[i].mm);
    }
    if(ans[top].nn==ans[top].mm)i=top-1;
    else  i=top;
    for(;i>=0;i--){
        printf("%I64d %I64d\n",ans[i].mm,ans[i].nn);
    }
    return 0;
}






1
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:31633次
    • 积分:1590
    • 等级:
    • 排名:千里之外
    • 原创:130篇
    • 转载:3篇
    • 译文:0篇
    • 评论:4条
    最新评论