三.數字
題目描述
對於正整數n,定義s(n)爲n在十進制表示時各位數字的和,d(n)爲對n一直做s(n)直到n變成一位數。例如:s(58)=5+8=13,s(13)=4,d(58)=d(13)=d(4)=4。
定義正整數x是優美的,當且僅當存在至少一個正整數y使得y*d(y)=x。
Your Task
請你求出,區間[A,B]中有多少個數是優美的。
輸入文件
第一行T表示數據組數
對於每組數據,一行中A B
輸出文件
對於每組數據,在一行中輸出[A,B]中優美的數的個數
樣例輸入
2
47 58
123456789 9876543210
樣例輸出
4
2618024258
數據約定
20%:1《=A<=B<=10^8
100%:T<=20,1<=A<=B<=10^10
首先,根據RP守恆定理,今天早上沒打開CF,所以此刻RP一定爆棚,就隨便編了個d(n)的表達式,沒想到居然對了......
(關於RP守恆定理 http://baike.baidu.com/view/88936.htm)
d(n)=(n-1)mod 9+1.
有人問了,爲什麼不是 n mod 9 呢,當n=9時就不成立啊......
然後,我們設 y=9*k+b (b<=9) 爲什麼b=9是可以的呢? 秋哥小白般地就問了,於是我說,後面會講.......
x=d(y)*y=((y-1) mod 9+1)*y=((b+1)-1)*(9*k+b)=9*b*k+b^2.
爲什麼b可以等於9,當y=9 時 , (0+9)mod 9+1=1 才成立 若b不能取9 則 得出的答案是(9+0)mod 9+1=1 不成立
得到b從1 到 9 的 方程,然後我比較懶,不想寫了,自己推,通式就是 X=9*B*K+B^2 b從1 到 9 遞增
然後發現有一些互相包含的X,排除掉(秋哥說要寫“排”字,不然別人WA了,就過來說:“不告訴你”)(大概是:b=1和8 b=3 和 6)
又發現有一些有交集的X,可以加上A和B,減掉C
用擴展歐幾里得可以推出 ,聯立兩個方程,解一個不定方程,q=變化數t*x原本的係數,w=最小的x值,滿足x mod q=w 的所有x減去即可。
(C是A與B的交集)(大概是:b=2和7 b=4 和 5)
最後又發現有的既不包含也不相交,就直接MOD掉......即可 (大概是:b=3和9)
至此,證畢(霸氣護體)
貼貼代碼:(大家沒看上面的話就無視掉吧......)
秋哥的小羅附體:
自我感覺講得很清楚了.......