首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

分金条的有关问题,有点困惑

2012-04-17 
分金条的问题,有点困惑问题 G: 分金条(JSU-ZJJ)时间限制: 1 Sec内存限制: 64 MB提交: 7解决: 2[提交][状态

分金条的问题,有点困惑
问题 G: 分金条(JSU-ZJJ)

时间限制: 1 Sec 内存限制: 64 MB
提交: 7 解决: 2
[提交][状态][讨论版]
题目描述

相信很多人都看过这个经典的数学故事:
有一个金条,你每天需要给tom七分之一,但是你只能将其分成三份,问怎么分才能满足要求?
解决方案是这样的: 只要我们把金条分成一块1/7,一块2/7,另一块4/7即可。
这样的话,第一天给tom七分之一的金条,第二天,让tom归还七分之一的金条,然后给他七分之二的金条,第三天给他七分之一和七分之二两块金条,第四天让他归还所有的金条并给他七分之四的那块金条,依此类推就能满足要求了。
本题是上面故事的加强版:
假设现在每天要给tom M分之一的金条,但是只能将其分成N份,请问能满足要求吗?
输入

首先是Case数 T (T<=100000)
然后T行,每行有两个数M,N,意思如上所述,(0<M<=100000, 0<N<=100000)。
输出

如果能够满足要求就输出YES,否则输出NO.
样例输入

2
7 3
8 3
样例输出

YES
NO
提示

//---------------------------------上面是题目
我的理解是
对于
输入
3 2
分成1/3 2/3第一次给tom 1/3第二次收回1/3给他2/3 第三次给他 1/3
7 3
同题目
可以知道分出的分数 刚好事 1 2 4 8 2的n-1次方
总数刚好是前n-1次方的和
可知只要满足前 n-1次方和等于输入的sum就输出YES
故代码如下

C/C++ code
#include <stdio.h>#include <stdlib.h>int Judge(long sum,long num){    int i;    long a = 1,s = 1;    if(sum == num) return 1;        //如果输入的俩数据相等 返回是    for(i = 1;i<num;i++)           //求2的num-1次方    {        a = a*2;        s = s + a;               //将1 - 2的num-1次方依次加起来    }    //printf("%ld %ld",a,s);    if(sum == s)                 //2的次方和等于sum    {        return 1;    }    return 0;}int main(){    int cc;    long m,n;    scanf("%d",&cc);    while(cc--)                //案例数    {        scanf("%ld %ld",&m,&n);  //输入两个数据        if(Judge(m,n))            printf("YES\n");        else            printf("NO\n");    }    return 0;}


[解决办法]
可知只要满足前 n-1次方和等于输入的sum就输出YES
结论错了
不是相等输出yes,是sum <=前 n-1次方和输出yes
并且计算1+2+....+2^(n-1)可以直接算2^n-1

热点排行