一本通 1633 例 3 Sumdiv

2022-08-13 11:00:18 字數 1464 閱讀 6889

今天早上考試考了這道題

題意:求$ a^ $所有約數之和%9901的結果。

思路:[暴力]快速冪+線性判約數再求和,30分。

[正解]看到求約數之和,很自然想到唯一分解定理,對於正整數n, n = $ a_1a_2\dots a_n^ $ 而言,它的約數之和為 $ (1+a_1+a_1^2+\dots +a_1)(1+a_2+a_22+\dots + a_2^)\dots (1+a_n+a_n^2+\dots +a_n^) $

而 $ a^b $ 只需將一直加到 $ a_i^* b} $ 即可。直接暴力求上述多項式的解似乎有50分。

接著考慮優化,不難看出對於每乙個多項式,都是乙個等比數列的和,即$ 1+a_i+a_i^2+\dots +a_i^ = \frac-1} \(, 所以

\) 1+a_i+a_i^2+\dots +a_i^ \equiv \frac-1} $ (mod p),那麼這裡我們只需要求出 $ a_i^-1 $ 以及 $ a_i-1 $ 在%p下的逆元即可。逆元這裡可以用費馬小定理求。(我也不曉得為什麼遞推求會wa掉幾個點)

對了,如果 $ a_i-1 $ 恰好是p的倍數怎麼辦呢?這種情況下逆元是不存在的。但是由於 $ a_i-1\equiv 0 $ (mod p), 那麼 $ a_i\equiv 1 $ (mod p),這樣一來

$ 1+a_i+a_i^2+\dots +a_i^\equiv 1+1+1+\dots + 1 $ (mod p), 即 $ (b_i+1) $ %p.

code:

#include #include #include #include #include #include #include using namespace std;

//mystery_sky

//#define m 5000101

#define inf 0x3f3f3f3f

#define ll long long

#define mod 9901

inline ll read()

while(c>='0'&&c<='9')

return x*f;

}ll a, b;

ll prime[m], tot, check[m], inv[m], cnt;

ll a[m], b[m];

inline void get_inv()

}inline ll quick_pow(ll x, ll k)

return ret % mod;

}int main()

} }if(n > 1) a[++cnt] = n, b[cnt] = 1;

ll ans = 1;

for(int i = 1; i <= cnt; i++)

else

} printf("%lld\n", (ans + mod) % mod);

return 0;

}

10020 一本通 1 3 例 3 小木棍

題目描述 原題來自 cerc 1995 喬治有一些同樣長的小木棍,他把這些木棍隨意砍成幾段,直到每段的長都不超過 50 現在,他想把小木棍拼接成原來的樣子,但是卻忘記了自己開始時有多少根木棍和它們的長度。給出每段小木棍的長度,程式設計幫他找出原始木棍的最小可能長度。輸入格式 第一行為乙個單獨的整數 ...

一本通1587 例 3 Windy 數

時間限制 1000 ms 記憶體限制 524288 kb 題目描述 原題來自 scoi 2009 windy 定義了一種 windy 數 不含前導零且相鄰兩個數字之差至少為 2 的正整數被稱為 windy 數。windy 想知道,在 a 和 b 之間,包括 a和 b,總共有多少個 windy 數?輸...

一本通 1 2 例 3 曲線

題目link 經典的三分裸題。三分主要是用來求乙個滿足單峰性的函式的最大 最小值的一種演算法,其原理和二分基本一樣。假設求最小值,首先把選擇區域分為三段,然後比較這兩個三等分點的函式值誰更小一些,大的那一邊就不要了 如果大的是靠左的,那就連著左邊不要了,靠右同理 容易證明這樣做是正確的,然後像二分那...