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 15squares 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.
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.
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.
26
6 1 26 2 9 3 5 5 3 9 2 26 1
2
2 1 2 2 1
8
4 1 8 2 3 3 2 8 1
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.
题意:给出一个整数N问有多少个n*m的格子内的正方形格子的数目等于N并输出这n*m个格子一个n*m的格子中设n为较小的一个则有这n*m的格子中正方形的数目为
n*m+(n-1)*(m-1)*...1*(m-n+1);即为n*n*m+n*(n-1)*n/2-n*(n-1)*m+1^2+2^2+....(n-1)^2;因此枚举n求出m即可。
/* ***********************************************
Author : ryc
Created Time : 2016-08-23 Tuesday
File Name : E:\acm\codeforces\332D.cpp
Language : c++
Copyright 2016 ryc All Rights Reserved
************************************************ */
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<list>
#include<vector>
#include<list>
#include<queue>
#include<map>
#include<set>
using namespace std;
typedef long long LL;
typedef pair<LL,LL>pll;
const int maxn=1000010;
set<pll>ans;
set<pll>::iterator it;
int main()
{
LL n,sum=0;cin>>n;
ans.insert(make_pair(1,n));
ans.insert(make_pair(n,1));
for(LL i=2ll;i<=n;++i){
sum=sum+(i-1)*(i-1);
if(sum>n)break;
LL num=i*(i*(i-1)/2ll);
if((n-sum+num)%((i*i+i)/2ll))continue;
if(n-sum+num<0)break;
if(i>((n-sum+num)/((i*i+i)/2ll)))break;
ans.insert(make_pair(i,(n-sum+num)/((i*i+i)/2ll)));
ans.insert(make_pair((n-sum+num)/((i*i+i)/2ll),i));
}
printf("%d\n",ans.size());
for(it=ans.begin();it!=ans.end();++it){
printf("%lld %lld\n",(*it).first,(*it).second);
}
return 0;
}