1286问题: X老师数小国
时间限制: 1 Sec 内存限制: 128 MB
提交: 990 解决: 316
[提交][状态][讨论版]
题目描述
众所周知,X老师是XDUACM实验室最优秀的人,无论是学习还是打游戏。今天他突然想到一个好玩的游戏。规则是这样的,在游戏中他要得到n个小国,初始的时候小国个小杰各有1个。经过了很久的修炼,X老师学会了两种魔法,他每次可以动用自己的智慧来使用魔法。
第一个魔法:(小杰变小国)可以将自己的智慧复制和当前小杰一样多的小国出来;
第二个魔法:(小国大爆发)可以将当前的小杰变成和小国的数量一样,然后小国的数量加倍!
因为X老师的智力是无限多的,他不关心花掉的智力大小。但是好学的X老师想尽快得到n个小国,使得能有更多的时间去读paper和打比赛。他想问问你,最少需要使用多少次魔法可以得到n个小国。
输入
多组数据,第一行一个正整数T(T<=20)表示数据组数。
接下来T行,每行一个正整数n(n<=100)。
输出
对于每组数据输出一个整数,表示得到n个小国汀老师最少需要使用多少次膜法。
样例输入
2
1
3
样例输出
0
2
提示
来源
sublimation
ac代码:
#include<stdio.h> void power(int x); int main(){ int n; scanf("%d",&n); while(n--){ int x; scanf("%d",&x); power(x); } return 0; } void power(int x){ int s=0; while(x%2==0||x%3==0||x%5==0||x%7==0){ if(x%2==0){ s++; x/=2; } else if(x%3==0){ s+=2; x/=3; } else if(x%5==0){ s+=4; x/=5; } else if(x%7==0){ s+=6; x/=7; } } if(x==11||x==13||x==17||x==19||x==23||x==29||x==31||x==37||x==41||x==43||x==47||x==53||x==59||x==61||x==67||x==71||x==73||x==79||x==83||x==89||x==97) s+=x-1; printf("%d\n",s); }
解析:
这又是一道数学题,
(1)数学化简,设小杰为m,小国为n
第一个魔法:(小杰变小国)可以将自己的智慧复制和当前小杰一样多的小国出来;
n=n+m;
第二个魔法:(小国大爆发)可以将当前的小杰变成和小国的数量一样,然后小国的数量加倍!
m=n,n=2n;
(2)再次化简:约数化简
通过找数字规律发现,素数2个需要1次,3个需要2次,5个需要4次,7个需要6次。
把这些数作为基数,x除以它就行了。因为我们发现比如15个8次就是3个*5个对应的2次*4次。
然后把那些其他的素数列举出来,s+=x-1;
(为什么不把11也作为基数?明明它也是素数啊。因为这里的n最大是100,不需要11*11)
ps:绝对有比这个还简单的算法,因为碰到了n最大是10的6次方的,真是妙啊