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
",(sum-1)*2);
            for(i=0;i<sum;i++)
                printf("%lld %lld
",a[i].x,a[i].y);
            for(i=sum-3;i>=0;i--)
                printf("%lld %lld
",a[i].y,a[i].x);
        }
        else
        {
            if(a[sum-1].x==a[sum-1].y)
            {
                printf("%d
",sum*2-1);
                for(i=0;i<sum-1;i++)
                printf("%lld %lld
",a[i].x,a[i].y);
            for(i=sum-1;i>=0;i--)
                printf("%lld %lld
",a[i].y,a[i].x);
            }
            else
            {
                printf("%lld
",sum*2);
            for(i=0;i<sum;i++)
                printf("%lld %lld
",a[i].x,a[i].y);
            for(i=sum-1;i>=0;i--)
                printf("%lld %lld
",a[i].y,a[i].x);
            }
        }
    }
    return 0;
}
原文地址:https://www.cnblogs.com/linliu/p/5449017.html