题目大意:找出K个从ai到bi(i=1,2,3,...,K)最长的一条路,输出路长,路上的元素满足:前一个整除后一个。
例如:input: output:
3 4(2,4,8,16)
2 16 5(3,9,27,81,243)
3 243 6(3,9,27,81,243,486)
3 486
Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u
数据规模:0<=K<=20,1<=a,b<=10^9。
理论基础:无。
题目分析:明显的贪心算法,每个问题具有最优子结构,每次选最小的可以整除它的数使每个结构的子结构的b最大,即可保证父结构为最优解。原问题在保证有因子a的情形下,父结构的b每次除以b的最小因子以后剩下的子结构的最优解+1即为原题目的解。比如:1(它自己)+beer(486)=1+beer(486/3=162(保证含有a=3))=2+beer(162/2=81)=6(由测例二可知当b=81时结构的最优解为4)。所以:当b%a==0时,ans=2+beer(b/a)。
当b%a!=0时,输出0。
代码如下:
#include<iostream>
#include<cstdio>
using namespace std;
int beer(int x)
{
for(int i=2;i*i<=x;i++)
{
if(x%i==0)return 1+beer(x/i);
}
return 0;
}
int main()
{
int a,b,T,ans;
scanf("%d",&T);
while(T--)
{
ans=0;
scanf("%d%d",&a,&b);
if(a>=b)
{
printf("%d\n",a==b);
continue;
}
if(b%a==0)
{
ans=2+beer(b/a);
}
printf("%d\n",ans);
}
return 0;
}
这次不加其中了。。。哈哈。。。
by:Jsun_moon http://blog.csdn.net/jsun_moon