zoukankan      html  css  js  c++  java
  • 251C Number Transformation

    C. Number Transformation
    time limit per test
    2 seconds
    memory limit per test
    256 megabytes
    input
    standard input
    output
    standard output

    Little Petya likes positive integers a lot. Recently his mom has presented him a positive integer a. There's only one thing Petya likes more than numbers: playing with little Masha. It turned out that Masha already has a positive integer b. Petya decided to turn his numbera into the number b consecutively performing the operations of the following two types:

    1. Subtract 1 from his number.
    2. Choose any integer x from 2 to k, inclusive. Then subtract number (a mod x) from his number a. Operation a mod x means taking the remainder from division of number a by number x.

    Petya performs one operation per second. Each time he chooses an operation to perform during the current move, no matter what kind of operations he has performed by that moment. In particular, this implies that he can perform the same operation any number of times in a row.

    Now he wonders in what minimum number of seconds he could transform his number a into number b. Please note that numbers x in the operations of the second type are selected anew each time, independently of each other.

    Input

    The only line contains three integers a, b (1 ≤ b ≤ a ≤ 1018) and k (2 ≤ k ≤ 15).

    Please do not use the %lld specifier to read or write 64-bit integers in С++. It is preferred to use the cin, cout streams or the %I64dspecifier.

    Output

    Print a single integer — the required minimum number of seconds needed to transform number a into number b.

    Sample test(s)
    input
    10 1 4
    output
    6
    input
    6 3 10
    output
    2
    input
    1000000000000000000 1 3
    output
    666666666666666667
    Note

    In the first sample the sequence of numbers that Petya gets as he tries to obtain number b is as follows: 10  →  8  →  6  →  4  →  3  →  2  →  1.

    In the second sample one of the possible sequences is as follows: 6  →  4  →  3.

    分析:求出模数们的最小公倍数c,那么若a-b>c,则中途必须经过几个c状态,所以我们只要DP计算出c内的转换最小数即可;若a-b>c,则直接计算从a到b的次数

    #include<cstdio>
    #include<cstring>
    #include<iostream>
    using namespace std;
    long long dp[400000];
    #define maxn 0x7fffffff
    int k;
    int gcd(int a,int b){
        for(int t;t=b;b=a%b,a=t);
        return a;
    }
    long long gao(long long a,long long b){
        int i,j,s;
        dp[0]=0;
        for(i=1;i<=a-b;++i){
            dp[i]=dp[i-1]+1;
            for(j=2;j<=k;++j){
               s=(b+i)%j;
               if(i-s>=0 && dp[i-s]+1<dp[i])
                   dp[i]=dp[i-s]+1;
            }
        }
        return dp[a-b];
    }
    int main() {
        long long a, b, ans;
        int i, j,c;
        while (cin >> a >> b >> k) {
            c=1;
            for(i=2;i<=k;++i){
                c=c*i/gcd(c,i);
              //  cout<<c<<endl;
            }
            
            if(a/c==b/c){
                cout<<gao(a,b)<<endl;
            }else if(a/c-b/c==1){
                cout<<gao(a%c,0)+gao(c,b%c)<<endl;
            }else{
                cout<<(a/c-b/c-1)*gao(c,0)+gao(a%c,0)+gao(c,b%c)<<endl;
            }
        }
        return 0;
    }

     

    这条路我们走的太匆忙~拥抱着并不真实的欲望~
  • 相关阅读:
    [USACO Mar08] 牛跑步 --k短路
    [ZJOI2008]树的统计Count
    [SDOI2010]魔法猪学院 --k短路
    POJ 2449 Remmarguts' Date -K短路
    [SCOI2007]kshort--k短路
    [HAOI2015]树上操作 -树链剖分
    HDU Aragorn's Story -树链剖分
    [USACO09JAN]安全出行Safe Travel
    2019全球区块链杭州高峰论坛将于5月17日举办!
    2019亚洲物联网安全创新国际峰会将于5月在上海开幕!
  • 原文地址:https://www.cnblogs.com/baidongtan/p/2809407.html
Copyright © 2011-2022 走看看