zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    关于禁止浏览器的回退功能
    实时监听输入框值变化的完美方案:oninput & onpropertychange
    Sublime Text 3 快捷键精华版
    计算手动输入的文本长度
    ie的用户名密码输入框右侧提示去掉
    获取元素定位
    select option
    js打断点
    Android LaunchMode
    Gradle 使用第三方库总结
  • 原文地址:https://www.cnblogs.com/linliu/p/5449017.html
Copyright © 2011-2022 走看看