纪念邮票

Problem Description

邮局最近推出了一套纪念邮票,这套邮票共有N张,邮票面值各不相同,按编号顺序为1分,2分,...,N分。
小杭是个集邮爱好者,他很喜欢这套邮票,可惜现在他身上只有M分,并不够把全套都买下。他希望尽量买,最好刚好花光所有钱。作为一个集邮爱好者,小杭也不想买的邮票编号断断续续。所以小杭打算买面值a分至b分的b-a+1张连续的邮票,且总价值刚好为M分。
你的任务是求出所有符合要求的方案,以[a,b]的形式输出。

Input

输入有多组测试用例,每组测试用例包含两个数N和M(1<=N,M<=10^9)。

Output

对于每组测试用例输出所有合法方案:[a,b],按a值从小到大输出。

Sample Input

20 15

Sample Output

[1,5]
[4,6]
[7,8]
[15,15]
 1 #include <stdio.h>
 2 #include <math.h>
 3 #include <algorithm>
 4 using namespace std;
 5 
 6 struct node {
 7     int a,b;
 8 } ans[1000];
 9 int T,n,m,cnt;
10 
11 bool cmp(const node &x, const node &y) {
12     if ( x.a!=y.a ) return x.a<y.a;
13     return x.b<y.b;
14 }
15 void cal() {
16     cnt=-1;
17     for (int i=0; i<=int( sqrt(2.0)*sqrt(m+0.0) ); ++i) {
18         if ( (2*m)%(i+1)==0  && (2*m/(i+1)-i) >=2 && (2*m/(i+1)-i)%2==0 ) {
19             int start=2*m/(i+1)-i;
20             start/=2;
21             if (i+start<=n) {
22                 ++cnt;
23                 ans[cnt].a=start;
24                 ans[cnt].b=start+i;
25             }
26         }
27     }
28 }
29 
30 int main() {
31     while(scanf("%d%d", &n, &m)!=EOF) {
32         cal();
33         sort(ans, ans+cnt+1,cmp);
34         for (int i=0; i<=cnt; ++i) printf("[%d,%d]\n", ans[i].a, ans[i].b );
35     }
36 
37     return 0;
38 }
View Code

 

转载于:https://www.cnblogs.com/contestant/archive/2013/06/03/3115862.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值