您的位置:首页 > 其它

Codeforces #332 Div2 D

2016-08-23 19:47 260 查看
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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  cf 数学