1、bzoj3481 DZY Loves Math III
求\(xy \equiv Q \pmod {P}\)的解的組數。以乘積形式輸入\(P,Q\)。
題解
一來直接把P拆質因子轉成多個方程最后求乘積。
現在考慮\(xy \equiv Q \pmod {pi^{ai}}\)的解的組數。
設\(p=pi^{ai}, Q=pi^{bi}\)
假設枚舉x
則答案為 sigma gcd(x,p) 其中[gcd(x,p) | q]
改成枚舉d=gcd(x,p)
或者說枚舉gcd有幾個pi因子
則答案為 sigma d* (sigma x: [gcd(x,p/d) == 1]) 其中d | gcd(p,Q)
這是因為你x含有的pi因子不能比d多,所以gcd(x,p/d) == 1
這個是歐拉函數
答案為 \(\sum_{d | gcd(p,Q)} d*φ(p/d)\)
枚舉i從0至\(min(a_i,b_i)\),算一下就行,要用公式把\(φ(p^a)\)拆開
\(φ(p^a)=p^a*(p-1)/p (a>0)\)
注意指數為0特判即可
Q等於0也要特判
(注意)一個小trick:\(gcd(i,a)==b \iff gcd(i/a,b/a)==1\)
2、無能為力
數據范圍\(10^9\)
題解
比較毒瘤
細節超多
(1)發現i=0時原式值為1,所以先不考慮0最后加上
(2)按照套路,大膽猜測斐波那契循環節為\(P-1\)要不然沒法做。。。
(3)拆質因子發現\(P-1=961749330=2 * 3 * 5 * 17 * 29 * 65027\)
(4)發現枚舉\(i\)沒有前途,於是枚舉 \(gcd(i,n)=d\),然后發現$ \dbinom{n}{d} $ 和 \(x^d\) 直接算即可
(5)考慮求滿足\(gcd(i,n)=d\)的\(y^i\)之和
\(gcd(i,n)==d \iff gcd(i/d,n/d)==1\)
即求滿足\(gcd(i/d,n/d)==1\)的\(y^i\)之和
對\(n/d\)的質因子暴力容斥
設枚舉到\(n/d\)的一個因子為\(U\)
則貢獻為$ \sum_{k=1}^{N/U} y^{Uk} $
這個式子的值可以分治+快速冪解決
(6)然后發現\(5\)在模\(961749331\)意義下有二次剩余,求Fib數列直接做就可以了
3、Function
數據范圍\(10^{18}\)
題解
推式子題
上來先打表
扔進OEIS
發現一個很不顯然的規律
$f(n)= \sum_{i^2 | n} {\frac{n}{i^2}} \( 於是我們愉快的枚舉\)i^2$即可
這樣枚舉范圍就變成\(10^9\)
可以推出\(Ans=\sum_{i=1}^{\sqrt{n}} \frac{\left \lfloor \frac{n}{i^2} \right \rfloor * (\left \lfloor \frac{n}{i^2} \right \rfloor + 1)}{2}\)
數論分塊即可。
注意本題卡\(cmath\)的\(sqrt()\)精度
傳入參數時轉成\(long double\)可以解決
速度墊底不知道為什么QwQ
4、Function(2)
數據范圍\(10^9\),多測。
題解
推式子題
上來先打表
發現一個不是很顯然的規律
設\(d(n)\)表示約數個數函數:
則\(\sum_{i|n} {μ(i)d(n/i)^2} = d(n^2)\)
數據范圍\(10^9\)?
我會暴力!
分塊打表即可,由於30kb大小限制,塊大小頂多設\(500000\)
交上去發現\(TLE\)
略加優化:塊內的某個位置從兩端逼近,比如\(F(999888)\)由\(F(1000000)\)來計算,而\(F(2002333)\)由\(F(2000000)\)來計算
常數減小一倍,就通過了。
5、Ceil it!
數據范圍 N<=\(10^{18}\)
題解(純圖片)
6、Road
題意及數據范圍:
求\(\sum_{i=1}^N G^i*i^M,N\le 10^9,M\le 50,G\)為\(A*A\)的矩陣,\(A\le 50\)。
題解:
\(tag\):分治,倍增,二項式定理,矩陣乘法
因為二項式定理同樣適用於矩陣,矩陣的乘法、加法也可以直接運算,因此我們可以把\(G\)直接當常數做。
設\(F(n,m)\)表示\(\sum_{i=1}^n G^i*i^m\)
答案為\(F(N,M)\)
直接遞推求\(F(N,M)\)復雜度顯然不可接受。
考慮快速冪形式的倍增:
\(F(2n,m)\)
\(=\sum_{i=1}^{2n} G^i*i^m\)
\(=\sum_{i=1}^n G^i*i^m + G^n\sum_{i=1}^n G^i*(i+n)^m\)
\(=F(n,m)+G^n\sum_{i=1}^n G^i\sum_{j=0}^m \dbinom{m}{j} i^j n^{m-j}\)
\(=F(n,m)+G^n\sum_{j=0}^m \dbinom{m}{j} n^{m-j}\sum_{i=1}^n G^ii^j\)
\(=F(n,m)+G^n\sum_{j=0}^m \dbinom{m}{j} n^{m-j} F(n,j)\)
對\(i\)維護\(F(i,0...m)\)
然后做快速冪
復雜度\(O(MA^3logN)\)
7、Fib
求第\(K\)大的滿足條件的自然數\(N\):
(1)N在Fibnacci數列中。
(2)N是完全平方數。
若不存在輸出\(-1\)
\(K\le 10^9\)
題解
只有\(1,1,144\)符合要求。
8、求\(\dbinom{n}{p} \pmod{p}\)
\(p\)是質數,\(3\le p\le n\le 10^{1000}\)
題解
手玩Lucas
答案即\(\left \lfloor \frac{n}{p} \right \rfloor\)
高精度除法膜法
9、最大公約數
求\(GCD(\dbinom{2N}{1},\dbinom{2N}{3},...,\dbinom{2N}{2N-1})\),答案對\(1000000007\)取模
\(N\le 10^{100000}\)
題解
\(lowbit(2N)\)
10、簡單數論題
題目描述:
給三個兩兩互質的數 \(a,b,c\),以及另一個數 \(m\), 現在他希望找到三個\((0,m)\)內的整數\(x,y,z\),
使得\(x^a+y^b=z^c \pmod{m}\)。\(10^5\)組數據,\(a,b,c,m\le 10^9\)。
Sol:
用\(2\)的方冪構造答案即可。
具體的,
構造\(p\times a=q\times b=t\),
這樣得到\((2^p)^a+(2^q)^b=2\times 2^t=2^{t+1}\),
只要用\(exgcd\)搞出\(2^{t+1}=(2^k)^c\)的滿足條件的\(k\)跟\(t\)就構造出一組\((x,y,z)\)了。
然后要注意\(exgcd\)求得的一對\(x,y\)要把調整成正數。
11、(Atcoder) ModularPowerEquation
讓你構造方程\(n^x\equiv x\pmod m\)的一個正整數解。
\(n,m\le 10^9\)
你的答案不超過\(2*10^{18}\)
Sol:
使用歐拉定理,
令$$x\equiv y\pmod {φ(m)},(x,y>0)$$
以及$$x\equiv n^x\equiv n^y\pmod m$$
繼續可推出$$y\equiv n^y\pmod{gcd(m,φ(m))}$$
注意到這與原問題形式一致,故遞歸求解得到一個\(y\)
此時使用\(EXCRT\)算法,求出\(x\)的值,注意時刻保持\(x,y>0\),當求出\(x=0\)時把\(x+=M\)就好
關於EXCRT算法相關的一些問題可以參考這里 https://www.cnblogs.com/bestwyj/p/10409806.html
但是以上過程感覺還是有一些疑點,這里說一下個人理解:
(1)首先我一來就是上的擴展歐拉定理,但是那個\(+φ(p)\)不太能處理。
后來發現由於某些奇怪的原因直接寫成歐拉定理就挺對的。
(2)題目中要求無解打"-1",但根據實測情況並不會出現無解,盡管全程\(Assert(c\%d==0)\),但EXCRT一直工作成功。隨了\(10^4\)左右組數據也沒出現什么問題。
12、中學數論題
設第 \(n\) 個素數是 \(l\),證明對於任意整數 \(0\le k\le n\) 都可以找到一個長度為 \(l\) 的正整數區間 \([i,i+l-1]\) 使得其區間素數個數等於 \(k\)。
Sol:離散介值隨便做一做
13、number
給 \(n(\le 10^{18})\),要你求所有 \(x\) 滿足 \(n|x\) 且 \(n=d(x)\) 的 \(x\) 的和,取模輸出或者報告有無窮個。
Sol:
對於 \(n\ge 6\),可以證明若 \(n\) 有平方因子,則答案為 inf,可以通過在爆搜的過程中構造方案證明。
對於 \(n\ge 6\) 且 \(n\) 無平方因子,根據爆搜的做法,顯然轉化為 \(\omega(n)\) 個點的二分圖匹配計數,可以狀壓DP。