acm-纪念邮票

纪念邮票

时间限制: 1000 ms  |  内存限制: 65535 KB
难度: 1
描述

    邮局最近推出了一套纪念邮票,这套邮票共有 张,邮票面值各不相同,按编号顺序为1分,2分,···,N分。

    小杭是个集邮爱好者,他很喜欢这套邮票,可惜现在他身上只有分,并不够把全套都买下。他希望尽量买,最好刚好花光所有钱。作为一个集邮爱好者,小杭也不想买的邮票编号断断续续。所以小杭打算买面值 分至 分的 b-a+1 张连续的邮票,且总价值刚好为 分。

    你的任务是求出所有符合要求的方案,以[a,b]的形式输出。

输入
输入只有一行,包含两个数N和M(1≤N,M≤10^9)。
输出
输出每行包含一个合法方案:[a,b]。按a值从小到大输出。
输出结果不包含任何空格。
样例输入
20 15
样例输出
[1,5]
[4,6]
[7,8]
[15,15]
来源

GDKOI 2006

我的代码:

首先我们要考虑到这是一个等差数列,只需要满足(a+b)*(b-a+1)/2==m就可以了,所以也就是2*m=(a+b)*(b-a+1),所以只需要找到有多少对数x=(a+b),y=(b-a+1),能够使x*y==2*m,然后使得:b<=n&&(a+b)*(b-a+1)==2*m就可以了,here we go:

#include<stdio.h>
#include<math.h>
int main()
{
	int  n,m;
	scanf("%d %d",&n,&m);
	for(int i=sqrt(2*m);i>=1;i--)
	{
		if((2*m)%i==0)
		{
			int x=2*m/i;
			int y=i;
			int a=(x-y+1)/2;
			int b=(x+y-1)/2;
			if(b<=n&&(a+b)*(b-a+1)==2*m)
				printf("[%d,%d]\n",a,b); 
		}		
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值