取模方程解的個數
題目描述
給定x和m,問在區間[a,b]上存在多少個i,使得xi % 1000 = m。
輸入
輸入由多組資料構成。
每組資料一行,由四個空格分開的整數x、m、a和b組成。
0 <= x, m <= 1000000000
1 <= a <= b <= 1000000000
輸出
每組輸入資料產生一行輸出,即使得上述等式成立的i的個數。
樣例輸入
13 13 1 100
13 12 1 100
13 13 1 1000000000
樣例輸出
1
0
10000000
題解
- i∈(a,b),(b)max=1000000000.肯定要用到快速冪並且取模1000;
- 取模1000,很明顯的知道,m的取值範圍為(0,999)。所以∀m>=1000,ans=0;
- 驗證規律性。
int x=13
int a=1,b=200;
for(int i=a;i<=b;i++){
cout<<pow_mod(x,i,1000)<<",";
}
13,169,197,561,293,809,517,721,373,849,37,481,253,289,757,841,933,129,677,801,413,369,797,361,693,9,117,521,773,49,637,281,653,489,357,641,333,329,277,601,813,569,397,161,93,209,717,321,173,249,237,81,53,689,957,441,733,529,877,401,213,769,997,961,493,409,317,121,573,449,837,881,453,889,557,241,133,729,477,201,613,969,597,761,893,609,917,921,973,649,437,681,853,89,157,41,533,929,77,1,13,169,197,561,293,809,517,721,373,849,37,481,253,289,757,841,933,129,677,801,413,369,797,361,693,9,117,521,773,49,637,281,653,489,357,641,333,329,277,601,813,569,397,161,93,209,717,321,173,249,237,81,53,689,957,441,733,529,877,401,213,769,997,961,493,409,317,121,573,449,837,881,453,889,557,241,133,729,477,201,613,969,597,761,893,609,917,921,973,649,437,681,853,89,157,41,533,929,77,1,
看出每隔100個數就會出現一次13。可能這個時候你會覺得答案就在眼前,但結果告訴你“答案錯誤”,因為並不是所有的數每隔100次就出現一次,也不是每個數就會多次出現。
不信再試試n=2,它的前幾項裡,2和4是隻出現一次的,只有從數字8開始才出現的迴圈。分析到這裡基本夠了。
還有一個可以證明的是,如果一個數在200次內沒有出現重複的數,他就不會有重複的數了。
- 程式設計的實現問題,①m>=1000,輸出ans=0。②0< m<1000,算出m重複出現的間隔,不重複出現輸出0,有間隔則輸出[a,b]區間內能滿足的次數。
程式碼
以後記得再貼