給定乙個數字,他在十進位制下從高位到低位一次是n0, n1, n2, n3,...
那麼定義它的「差和」為n0-n1+n2-n3+...
如:十進位制數字abcdefg,每個字母代表乙個位,那麼差和為a-b+c-d+e-f+g。
所以十進位制數字1234567差和為1-2+3-4+5-6+7=4
現在給你們乙個閉區間[m, n],請求出區間內差和為x的數字個數。
輸入只有一行,三個數字,m n x
30%: 0<= m <= n <=10^3, 50%: 0<= m <= n <=10^8, 100%: 0<= m <= n <=10^18
-100<= x <=100
輸出只有乙個數字,表示區間內差和為x的數字的總和mod1000000007的結果。
100 111 1
211
這題不會做,妥妥的。為了看懂助教的**,費了好大勁兒,乾脆加點注釋,防止以後有用。
要點:1.由於區間太大,無法遍歷,所以要把乙個數按位處理,有點轉化為陣列的意思。
2.動歸記錄的陣列中有遍歷所有和差值,為了能用陣列下標表示,把-100-100轉化到0-200,計算乙個數的和差值時加上100,這樣雖然和差值變了,但對應和差值的數是沒有變的。
3.需要同時更新滿足和差值的所有數的和以及個數,之所以要記錄個數,是為了加上最高位對應的值,比如首位為1長度為5的情況,它的數之和為所有對應滿足的長度為4的數之和加上 個數*10000.
4.在最高位確定情況下,它的子問題(即位數少一位)的首位數是可以為零的。
具體看**及注釋:
1 #include 2view code#define limit 1000000007 34
long
long dp[22][10][220][2] = {}; //
分別表示數字的長度,數字首位數,和差的值+100,滿足和差值的所有數的和以及個數
5long
long basics[22] = ; //
預處理的陣列,方便使用,分別為0,1,10,100,。。。
6long
long lower, upper, sum; //
三個輸入的值 78
long
long getresult(long
long
number)
26 result %=limit;27}
28return
result;29}
3031
intmain()
39for(int i = 2; i < 22; ++i)
40for(int j = 0; j < 10; ++j)
41for(int k = 0; k < 200; ++k)
46 dp[i][j][k][0] += dp[i][j][k][1] * (j * basics[i] % limit) % limit; //
加上最高位的對應值
47 dp[i][j][k][0] %=limit;
48 dp[i][j][k][1] %=limit;49}
50long
long result_upper = getresult(upper+1
);51
long
long result_lower =getresult(lower);
52long
long result = result_upper -result_lower;
53if(result < 0
)54 result +=limit;
55 printf("
%lld\n
", result);
56 }
演算法之路之征服上海交大的oj 矩陣翻轉
矩陣翻轉 description 給定乙個正方形的整數矩陣,輸出將該矩陣按某一方向翻轉後的結果。input format 輸入第一行有乙個整數n,表示一共有n組資料 n不會為負數。之後有n組資料,對於每組資料 第一行有兩個整數a和b,分別表示正方形矩陣的邊長,以及翻轉的方向。當b 0時水平翻轉,當b...
演算法之路之征服上海交大的oj 水槍滅火
水槍滅火 description 以此題紀念上海 11 15 高樓火災遇害者 11月15日下午,上海靜安區膠州路728號的一幢28層民宅發生嚴重火災。消防部門接警後立刻出動25個消防中隊 百餘輛消防車投入滅火搶救行動,緊急疏散和救助了附近居民百餘人。火災導致58人遇難。此時大樓的所有樓層已經全部被烈...
演算法之路之征服上海交大的oj 求和遊戲
求和遊戲 description 石柱上有一排石頭鍵盤,每個鍵上有乙個整數。請你在鍵盤上選擇兩個鍵,使這兩個鍵及其之間的鍵上的數字和最大。如果這個最大的和不為正,則輸出 game over input format 第1行 鍵的個數n。第2.n 1行 鍵上的數字整數 ai 100 ai 100 對於...