Descriptionios
zyf最喜歡的數字是1!因此他常常會使用一些手段,把一些非1的數字變 成1,併爲此得意不已。他會且僅會的兩種手段是:
1.把某個數m除以某個質數p——固然p必須能整除這個數,即m=m/p
2.把某個數m減1,即m=m-1
有一天他突發奇想,想把[a,b]區間中全部的數一個一個地變成1,這是一個巨大的無聊的工程,因此他想知道他最少得花多少操做才能達到目 的。算法
1 #include <iostream> 2 #include "math.h" 3 using namespace std ; 4 5 int res[100001] ; 6 bool sieve[100001] = {0}; 7 int prime[10000] ; 8 9 int main() 10 { 11 12 13 int a,b,i,j,k; 14 int prime_length = 0 ; 15 for( i = 2 ; i < 100001 ; i++){ // get prime list 16 if(sieve[i] == false){ 17 prime[prime_length++] = i ; 18 res[i] = 1 ; 19 for( j = 2 ; j * i <= 100000 ; j++){ 20 sieve[i*j] = true; 21 } 22 } 23 } 24 res[0] = res[1] =0 ; 25 res[2] = res[3] = 1 ; 26 for(i = 2 ; i < 100001 ; i++ ){ //DP get res[num] 27 if(res[i] == 0 || res[i-1] < res[i]-1 ){ 28 res[i] = res[i-1] + 1 ; 29 } 30 for(j = 0 ; j < prime_length && i * prime[j] < 100001 ; j++){ 31 if(res[i*prime[j]] == 0 || (res[i]+1) < res[i*prime[j]]){ 32 res[i*prime[j]] = res[i] + 1; 33 } 34 } 35 } 36 37 while(cin>>a>>b){ 38 39 40 j = 0; 41 for(i = a ; i <= b ;i++){ 42 j += res[i] ; 43 } 44 cout << j << endl; 45 } 46 }