sicily 1218. 纪念邮票

// 题意: 给出n,m,求出 等差数列: a+(a+1)+...+(b-1)+b=m 有多少种(a,b)组合可能性, 其中a<=b<=n 
#include<iostream>
#include <stdio.h>
#include<map>
using namespace std;
int main()
{
int n,m;
map<int ,int> col;
cin>>n>>m;
int a,c; //设a,b间距离为c,即 c=b-a,所以 a+..+b=(a+b)(b-a+1)/2=(2a+c)(c+1)/2=m

//一个c对应惟一的(a,b), 以c而不是以a来作循环变量,可以大大缩小次数
for(c=0;c*c<2*m;++c) //根据 c^2+2ac+2a=2m ,得 c^2 < 2m
{
//根据(2a+c)(c+1)=2m,需要满足 2a+c是整数 且 2a 是偶数 且 2a 大于0
if( 2*m%(1+c)==0 && (2*m/(1+c)-c)%2==0 && (2*m/(1+c)-c)>=2 )
{
a=(2*m/(1+c)-c)/2;
if(a+c<=n) // b=a+c,因为n,m的大小关系不明确,所以b<=m并不能保证b<=n
col.insert(pair<int,int>(a,a+c));
}
}
for(map<int,int>::iterator ite=col.begin();ite!=col.end();++ite)
printf("[%d,%d]\n",ite->first,ite->second);
return 0;
}

posted on 2012-03-27 13:02  sysu_mjc  阅读(264)  评论(0编辑  收藏  举报

导航