hdu 1725(Find minimal sum)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1725
思路:几天前看到过这道题,当时没什么想法,今天心血来潮,就想尝试一下,1Y...orz...
一开始先打个表,把13以内的阶乘都算出来,然后二分查找,二分查找的时候如果没有找到相等的,返回的位置是后一个。。。这样循环就可以了。
View Code
1 #include<iostream> 2 using namespace std; 3 int facs[13]={0,1,2,6,24,120,720,5040,40320,362880,3628800,39916800,479001600};//打表找出前12个的阶乘 4 5 int Binary_Search(int low,int high,int number){ 6 while(low<=high){ 7 int mid=(low+high)/2; 8 if(facs[mid]==number)return mid; 9 else if(facs[mid]>number)high=mid-1; 10 else low=mid+1; 11 } 12 return low; 13 } 14 15 int main(){ 16 int n; 17 scanf("%d",&n); 18 while(n--){ 19 int m,summin=0; 20 scanf("%d",&m); 21 while(m){ 22 int pos=Binary_Search(0,12,m);//二分 23 //相等的话就要退出 24 if(facs[pos]==m){ 25 summin+=1; 26 break; 27 }else { 28 summin+=m/facs[pos-1]; 29 m%=facs[pos-1]; 30 } 31 } 32 printf("%d\n",summin); 33 } 34 return 0; 35 }