zoukankan      html  css  js  c++  java
  • Codeforces Round #332 (Div. 2) D. Spongebob and Squares 数学题枚举

    D. Spongebob and Squares

    Time Limit: 20 Sec

    Memory Limit: 256 MB

    题目连接

    http://codeforces.com/contest/599/problem/D

    Description

    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.

    Input

    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.

    Output

    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.

    Sample Input

    26

    Sample Output

    6
    1 26
    2 9
    3 5
    5 3
    9 2
    26 1

    HINT

    题意

    给你x,然后让你找有多少个n*m的矩形,可以由x个相同的多边形组成

    题解:

    数学题,这道题实际上是问,f(n,m) = sigma(k=1,k=min(n,m))(n-k+1)*(m-k+1)=x的解有多少个

    化简之后,我们可以得到f(n,m) = n^2m+n^2+n*m+n-(n+1)*n/2*(n+m+2)+n*(n+1)*(2n+1)/6

    这个式子是一个关于m的一次函数,我们枚举n就好了

    就可以求m了,注意break条件

    #include<iostream>
    #include<stdio.h>
    #include<vector>
    #include<algorithm>
    using namespace std;
    
    struct node
    {
        long long x,y;
    };
    bool cmp(node a,node b)
    {
        return a.y>b.y;
    }
    vector<node> ans1;
    int main()
    {
        long long x;cin>>x;
        for(long long i = 1;i<=10000000LL||i*i*i<=x;i++)
        {
            long long a = (i*i+i-(i+1)*i/2LL);
            long long b = (i*i+i-(i+1)*i*i/2LL-(i+1)*i+(i*(i+1)*(2*i+1)/6));
            long long y = x;
            long long t= (y-b)/a;
            if(i>t)continue;
            if(a*t+b==y)
            {
                if(i==t)
                {
                    node k;k.x = i,k.y = t;
                    ans1.push_back(k);
                }
                else
                {
                    node k;k.x = i,k.y = t;
                    ans1.push_back(k);
                    k.x = t,k.y = i;
                    ans1.push_back(k);
                }
            }
        }
        sort(ans1.begin(),ans1.end(),cmp);
        printf("%d
    ",ans1.size());
        for(int i=0;i<ans1.size();i++)
        {
            printf("%lld %lld
    ",ans1[i].x,ans1[i].y);
        }
    }

    代码

  • 相关阅读:
    Shell变量
    Shell执行脚本
    C++类的默认成员函数
    C# CAD 二次开发(二) -集成开发环境VS2012+CAD2016
    C# CAD 二次开发(一) -前期搜集资料篇
    WPF 学习笔记(十二)
    WPF 学习笔记(十一)
    WPF 学习笔记(十)
    WPF 学习笔记(九)
    WPF 学习笔记(八)
  • 原文地址:https://www.cnblogs.com/qscqesze/p/4982853.html
Copyright © 2011-2022 走看看