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.
题目链接:点击打开链接
给出正方形个数x, 要求输出k个矩形的长宽, k个矩形的正方形数为x.
数学题, 枚举n求出相应的m, 递推公式求n, n * m矩形中含有sum((n - i) * (m - i))个正方形, 即sum(n * m - i * (n + m) + i * i).
AC代码:
#include "iostream"
#include "cstdio"
#include "cstring"
#include "algorithm"
#include "cmath"
#include "utility"
#include "map"
#include "set"
#include "vector"
#include "list"
using namespace std;
typedef long long ll;
const int MOD = 1e9 + 7;
const int MAXN = 1e5 + 5;
ll x, num, sum, n[MAXN], m[MAXN];
int main(int argc, char const *argv[])
{
scanf("%lld", &x);
for(ll i = 1; x >= i * i; ++i) {
x -= i * i;
sum += i;
if(x % sum == 0) {
n[num] = i;
m[num++] = i + x / sum;
}
}
for(ll i = num - 1; i >= 0; --i)
if(n[i] != m[i]) {
n[num] = m[i];
m[num++] = n[i];
}
printf("%lld\n", num);
for(ll i = 0; i < num; ++i)
printf("%lld %lld\n", n[i], m[i]);
return 0;
}