XDU1286问题: X老师数小国

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除以它就行了。因为我们发现比如158次就是3*5个对应的2*4次。

 

然后把那些其他的素数列举出来,s+=x-1;

(为什么不把11也作为基数?明明它也是素数啊。因为这里的n最大是100,不需要11*11

 

 

ps:绝对有比这个还简单的算法,因为碰到了n最大是106次方的,真是妙啊


猜你喜欢

转载自blog.csdn.net/sandalphon4869/article/details/80033714