您的位置:首页 > 其它

URAL 1355

2013-08-10 23:26 393 查看
题目大意:找出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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息