超级变变变
Description
經過一系列的游戲之后,你終于迎來了今天的作業,第一個作業是預習一個超級美好的函數f(x),描述如下。
為了研究這個函數的性質,你決定定義一次變化為x=f(x)。
若x就經過若干次變化為k,則你就會覺得這是一個k變變數。
現在既然你已經這么覺得了,那就只好給定A,B,求有多少個A<=x<=B是k變變數了。
Input
輸入包含三行。
第一行為一個整數k。
第二行為一個整數A。
第三行為一個整數B。
Output
輸出僅一行,表示答案。
Sample Input
Sample Input 1
13
12345
67890123
Sample Input2
1
234567
1234567
Sample Output
Sample Output1
8387584
Sample Output2
1000001
Data Constraint
Hint
對于50%的數據,0<=k,A,B<=10^6
對于100%的數據,0<=k,A,B<=10^18 A<=B
.
.
.
.
.
分析
對于一個k,我們可以知道,它可以是由2 * k和2 * k+1變化得來的
而2 * k又是由2 * 2*k和2 * 2 * k+1變化得來的
同時2 * k+1又是由2 * (2 * k+1)和2 * (2 * k+1)+1變化得來的
以此類推,我們就可以得到一棵二叉樹
其中,每一層的數字都是連續的,樹上的每一個數字都可以通過變化得出k
利用這個性質,我們可以通過判斷每一層有多少個數字在a~b的范圍內從而逐層累加的出答案
然而,當k為偶數時
k不僅能由2 * k和2 * k+1變化得來,同時也能由k+1變化得來
因此,當k為偶數時,答案的統計也應該加上k+1的答案
由于任何數都可以變化得到0、1、2
所以,當k=0或1或2時,可以直接輸出答案
要注意k有可能大于a
所以答案的統計范圍為max(a,k)~b
.
.
.
.
.
.
程序:
轉載于:https://www.cnblogs.com/YYC-0304/p/10458949.html
總結