[題目]
【問題描述】
你的任務非常簡單,計算1至n的k次方的和。
【輸入格式】
輸入檔案不超過100行,第一行乙個整數k。然後每行乙個正整數n。
【輸出格式】
對於每個詢問輸出乙個正整數,即答案mod 99997後的結果。
【樣例輸入】 2
1 23
【樣例輸出】 1
5 14
【資料範圍】
50%的資料n*k<=10^6
100%的資料n<=10^9,k<=100000
[報告]
這道題唯一沒有弄懂的是,我自己寫的乙個秦九韶演算法計算兩個幾乎要超範圍的單精度整數乘法的時候為什麼只能拿70分(是wa,非tle),而轉成long long再直接乘就ac了……
一拿到這道題,最直接的想法是推通項——但這個貌似是不可能的。所以就沒思路了……
沒思路怎麼辦?暴力!
既然是暴力,所以tle是顯然的,所以要盡量增加優化——比如對輸入資料進行排序,就可以按順序處理,一次遍歷就可以搞定。另乙個優化就是快速冪演算法。加了這兩個演算法就70了(剩下的tle)。
注意到a^k%m==(a+m)^k%m(這個不證明了,反正是正確的),那麼其實只要記錄下0^k,1^k,2^k,……,(m-1)^k(存入陣列s)就可以了,然後後面的計算直接利用這些記錄下的數就可以了(鄙人相信這個優化的有用性,不過加了還是70分……)。
還是tle,怎麼辦呢?涼拌~
注意到每個a(就是題目中所說的n,下文中的n均為a的個數)遠大於m(99997),於是s會被遍歷很多次。那為什麼不算出乙個值b=sum(s)?那麼不需要一次又一次的遍歷s了(悲劇的是,加了這個優化還是70……)
由於題目中求的是前n個數的k次冪和模m的值,根據求和定理,可以把s直接加起來,也就是s[i]表示前i個數的k次冪和模m的值。那s[m-1]就相當於上面的b,所以對於每個a,最後的答案就是(a/m*s[m-1]+s[a%m])%m。
所以該題目的時間複雜度為o(mlongk+n),o(mlongk)為初始化(計算s陣列的複雜度),o(n)為最後直接輸出答案的複雜度。空間複雜度為o(m)。
至此,該題目在演算法上完美解決……
[程式]
// task: sum
#include
#include
#include
#include
#include
#define n 100
#define m 99997
using namespace std;
ifstream fin ("sum.in");
ofstream fout ("sum.out");
long n,k;
long a[n+1];
long s[m+1];
long ans[n+1],p[n+1];
static inline long calc(long qs,long k)
} int main(int argc, char *ar**)
python求和函式sum 詳解
我本來想算幾個int值相加的和,本以為很簡單的事情,結果卻很悲傷,例 sum sum 1,2,3 結果很明顯出現問題報錯 typeerror sum expected at most 2 arguments,got 3傻乎乎的我以為只能算前兩個數的和等於3,就又試了一下 sum sum 1,2 結果...
sql 縱向求和 乙個求和的sql語句 sum
表描述 表名 sum test id name count type 1 a 12 1 2 b 12 1 3 c 12 1 4 d 12 1 5 b 12 2 6 b 12 1 7 a 12 2 8 a 12 1 9 c 12 1 10 b 12 1 結果 type 1 84 type 2 36 求...
解決Numpy中sum函式求和結果維度的問題
使用numpy 下面簡稱np 中的sum函式對某一維度求和時,由於該維度會在求和後變成乙個數,所以所得結果的這一維度為空。比如下面的例子 a np.array 程式設計客棧 1,2,3 4,5,6 b np.sum a,axis 1 print b.shape 2,所www.cppcns.com以,...