上交OJ-1012. 增长率问题

2018-05-17  本文已影响15人  code猪

1012. 增长率问题


Description

有一个数列,它是由自然数组成的,并且严格单调上升。最小的数不小于S,最大的不超过T。现在知道这个数列有一个性质:后一个数相对于前一个数的增长率总是百分比下的整数(如5相对于4的增长率是25%,25为整数;而9对7就不行了)。现在问:这个数列最长可以有多长?满足最长要求的数列有多少个?

Input Format

输入仅有一行,包含S和T两个数( 0<S<T≤200000 )。

30%的数据,0<S<T≤100 ;

100%的数据,0<S<T≤200000。

Output Format

输出有2行。第一行包含一个数表示长度,第二行包含一个数表示个数。

Sample Input

2 10

Sample Output

5
2

样例解释

2 4 5 6 9以及2 4 5 8 10

分析

这道题使用动态规划分析,其关键在于:
(tmp-i)/i=j/100
展开则有:tmp=i+ij/100,即ij能被100整除。

#include <iostream>

using namespace std;

int main()
{
    long long int max_length[200000], max_num[200000];
    int s,t;
    int i,j;
    int tmp;
    long long int maxl=1,maxn; //注意溢出,和最少一个
    cin>>s>>t;
    maxn=t-s+1; //当为一个的时候,其可以有这么多个,考虑质数情况
    for(i=s; i<=t; i++)
        max_length[i]=max_num[i]=1;
    for(i=s; i<=t; i++) {
        for(j=1; j<=100; j++){
            if((i*j)%100 == 0) {
                tmp=i+(i*j)/100;
                if(tmp<=t) {
                    if(max_length[i]+1 > max_length[tmp]) {
                        max_length[tmp] = max_length[i]+1;
                        max_num[tmp]=max_num[i];
                    }
                    else if(max_length[i]+1==max_length[tmp])
                        max_num[tmp]+=max_num[i];
                    if(max_length[tmp]>maxl) {
                        maxl=max_length[tmp];
                        maxn=max_num[tmp];
                    }
                    else if(max_length[tmp]==maxl) 
                        maxn+=max_num[i];
                }
            }
        }
    }
    cout<<maxl<<endl<<maxn<<endl;
    return 0;
}
上一篇 下一篇

猜你喜欢

热点阅读