Codeforces #332 Div2 D

1 篇文章 0 订阅

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

题意: 假设有个n*m的矩形,那么它含有的正方形个数可以这样计算,先算边长为1的,有n*m个,接着算边长为2的....例如3*5的矩形中含26个正方形,即15+8+3=26.现在输入一个数x,表示正方形的个数,求有多少个矩形满足含有n个正方形,并输出这些矩形的长和宽,按照长递增输出.

可以根据题意计算出当n确定时,m可以由x和n表示出来。这时候枚举n(发现n不是很大..)用自己算的公式求m

刚开始不知道n不是很大..只是估计了一下感觉不会特别大..t了好几次..后来强行把n的范围限制在200000试了一下居然就过了..想知道正解是什么样的..

<span style="font-size:18px;">#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
typedef long long ll;
const ll maxn=2000000;
ll ans[1000000][2];

int main()
{
   ll x,t=0,a,b,k=0,i;
   scanf("%I64d",&x);
   if(x==1){printf("1\n1 1\n");return 0;}
   for(i=1;i<maxn;i++)
   {
      t+=(i-1)*(i-1);
      a=i*(i-1)/2*i;
      b=i*(i+1)/2;
      if((x+a-t)%b==0)
      {
         ans[k][0]=i;
         ans[k++][1]=(x+a-t)/b;
      }
      if(2*i*i>x)break;
   }
   for(i=0;i<k;i++)
   {
      if(ans[i][0]>ans[i][1])break;
   }
   k=i;
   if(ans[k-1][0]==ans[k-1][1])
   {
      printf("%I64d\n",2*(k-1)+1);
      for(i=0;i<k;i++)printf("%I64d %I64d\n",ans[i][0],ans[i][1]);
      for(i=k-2;i>=0;i--) printf("%I64d %I64d\n",ans[i][1],ans[i][0]);
   }
   else
   {
      printf("%I64d\n",2*k);
      for(i=0;i<k;i++)printf("%I64d %I64d\n",ans[i][0],ans[i][1]);
      for(i=k-1;i>=0;i--) printf("%I64d %I64d\n",ans[i][1],ans[i][0]);
   }
   return 0;
}</span>


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值