acm模版
對於數論只會打表找規律的我來說,我一上來就打了一張表,然後發掘其中的規律……沒法子,腦子跟不上,推不出來規律,只能找規律。
通過這個表我們可以發現:
從第100項到51項是等差數列0~49,base = 1;
從第50項到34項是等差數列0~32,base = 2;
從第33項到26項是等差數列1~22,base = 3;
……所以我們可以發現,這是由項數遞減的若干等差數列構成的,而這個項數滿足n - x = st + base * x
,化簡也就是說項數x = (n - st) / (base + 1)
,這裡需要注意的是向上取整才行,至於為什麼,自己模擬試試就知道了,另外還需要注意的是這裡可能會超 long long,所以需要用到乘法逆元,也就是 2 對 mod 的逆元,因為求等差數列的和時涉及到了乙個除以 2 的操作,在這裡,由於只用到了這乙個逆元,所以直接 const 乙個值表示它即可,也就是 5e8 + 4,gg!
#include
using namespace std;
const
int mod = 1e9 + 7;
const
int mod_2 = 5e8 + 4;
int main(int argc, const
char * argv)
if ((base + 1) * x != m - st) // 向上取整
ed = st + (x - 1) * base;
res = (res + ((st + ed) % mod * (x % mod)) % mod * mod_2 % mod) % mod;
m -= x;
if (m == 0)
st = (ed + base) % m;
base++;
}for (int i = 1; i <= m; i++)
cout << res << '\n';
return
0;}
51 Nod 1225 餘數之和
基準時間限制 1 秒 空間限制 131072 kb 分值 80 難度 5級演算法題 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 100000...
51Nod1225餘數之和
題目鏈結 題意 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的結果即可。輸入 輸入1個數n 2 n 10 12 輸出 輸...
51nod1225 餘數之和
打表可以看出規律。分塊求就可以了。include include include includeusing namespace std define ll long long ll read const ll mod 1e9 7 const ll tt 5e8 4 int main printf l...