題目鏈結
題意:
給定兩個數n
nn和k
kk,求∑i=
1nik
mo
d10007
\sum_^ni^k\ mod\ 10007
∑i=1n
ikmo
d100
07的值題解:
容易發現直接暴力列舉的時間複雜度是o(n
logn
)o(nlogn)
o(nlog
n),而n
nn的資料範圍比較大,因此暴力不行。
我們可以考慮到,這裡的模數10007比較小,因此,我們可以從每個數模10007的餘數下手。利用這個同餘,我們發現1k,
10008k
,20015k
,…
%10007
1^k,10008^k,20015^k,\dots\%10007
1k,100
08k,
2001
5k,…
%100
07的值是相等的。可以發現,每隔10007個數就會出現乙個同餘的數,可以得到證明。因此,我們這裡可以直接列舉餘數,然後找出每個餘數出現次數即可得到最後的答案。
實現細節見**:
#include
using
namespace std;
typedef
long
long ll;
ll qpow
(ll a, ll b)
a =(a * a)
%10007
; b >>=1;
}return ans;
}int
main()
cout << ans << endl;
}return0;
}
51nod 1225 餘數求和(分塊)
f n n 1 n 2 n 3 n n 其中 表示mod,也就是餘數。例如f 6 6 1 6 2 6 3 6 4 6 5 6 6 0 0 0 2 1 0 3。給出n,計算f n 由於結果很大,輸出mod 1000000007的結果即可。input 輸入1個數n 2 n 10 12 output 輸出...
51nod 1081 子段求和
1081 子段求和 基準時間限制 1 秒 空間限制 131072 kb 分值 0 難度 基礎題 給出乙個長度為n的陣列,進行q次查詢,查詢從第i個元素開始長度為l的子段所有元素之和。例如,1 3 7 9 1,查詢第2個元素開始長度為3的子段和,1 1。3 7 9 19,輸出19。input 第1行 ...
51NOD 1081 子段求和
1081 子段求和 給出乙個長度為n的陣列,進行q次查詢,查詢從第i個元素開始長度為l的子段所有元素之和。例如,1 3 7 9 1,查詢第2個元素開始長度為3的子段和,1 1。3 7 9 19,輸出19。input 第1行 乙個數n,n為陣列的長度 2 n 50000 第2 至 n 1行 陣列的n個...