D. Spongebob and Squares--cf599D(数学)
http://codeforces.com/problemset/problem/599/D
题目大意:给你一个数k 让你求一个n*m的矩形里面包含k个正方形 输出有几个这样的矩形 分别是什么
可以推出一个数学公式
我们枚举i*i的正方形 这个正方形里面的包含的正方形是有(i*i)+(i-1) *( i-1)+(i-2)*(i-2)+...+(1*1) 就等于b=i*(i-1)*(2*i-1)/6;
如果k>b 说明这个正方形里面的正方形是不够的 我们需要再添加n个(1*i)的列
如果添加一列能增加的小正方形是(从0加到i)i*(i+1)/2
所以如果说(k-b)%(i*(i+1)/2)==0 说明正好有(k-b)/(i*(i+1)/2)这么多列 然后就保存下来就行了
i最多也就2000000的样子 可以直接暴力
#include <iostream> #include <cstring> #include <algorithm> #include <queue> #include <cstdio> #include <cstdlib> #include <cctype> #include <math.h> #include <ctype.h> using namespace std; #define memset(a,b) memset(a,b,sizeof(a)) #define N 5001000 typedef long long ll; const double ESP = 1e-8; #define INF 0xfffffff struct node { ll x,y; }a[N]; int main() { ll k; while(scanf("%lld",&k)!=EOF) { ll sum=0; ll i; int flag=0; ll p=(ll)sqrt(k); for(i=1;;i++) { if(i>2000000 || i>p) break; ll b=(i*(i+1)*(2*i+1)/6); ll c=i*(i+1)/2; if(k>=b&&(k-b)%c==0) { a[sum].x=i; a[sum++].y=(k-b)/c+i; } } if(a[sum-1].y==a[sum-2].x && a[sum-1].x==a[sum-2].y) { printf("%lld\n",(sum-1)*2); for(i=0;i<sum;i++) printf("%lld %lld\n",a[i].x,a[i].y); for(i=sum-3;i>=0;i--) printf("%lld %lld\n",a[i].y,a[i].x); } else { if(a[sum-1].x==a[sum-1].y) { printf("%d\n",sum*2-1); for(i=0;i<sum-1;i++) printf("%lld %lld\n",a[i].x,a[i].y); for(i=sum-1;i>=0;i--) printf("%lld %lld\n",a[i].y,a[i].x); } else { printf("%lld\n",sum*2); for(i=0;i<sum;i++) printf("%lld %lld\n",a[i].x,a[i].y); for(i=sum-1;i>=0;i--) printf("%lld %lld\n",a[i].y,a[i].x); } } } return 0; }