日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

欧拉计划 P429 (数论)

發布時間:2024/1/8 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 欧拉计划 P429 (数论) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

歐拉計劃 P429 Sum of squares of unitary divisors(數論)

傳送門:https://projecteuler.net/problem=429

題目大意:

定義一個數 n n n 的因數 d d d 為獨立因數,當且僅當 gcd ? ( d , n / d ) = 1 \gcd(d,n/d)=1 gcd(d,n/d)=1 。定義函數 s ( n ) s(n) s(n) n n n 的所有獨立因數的平方和。求 s ( 100000000 ! ) m o d 1000000009 s(100000000!) \bmod 1000000009 s(100000000!)mod1000000009

題解:好久沒做過歐拉計劃了。。。沒想到隨手一翻就找到了一道很像acm數論題的題目。。。考慮唯一分解定律, ? n ∈ N , n = p 1 s 1 p 2 s 2 ? p r s r \forall \space n\in N,n=p_1^{s_1}p_2^{s_2}\cdots p_r^{s_r} ??nN,n=p1s1??p2s2???prsr?? ,一個因數為獨立因數時,那么這個獨立因數一定可以寫成 p a 1 s a 1 p a 2 s a 2 ? p a k s a k p_{a_1}^{s_{a_1}}p_{a_2}^{s_{a_2}}\cdots p_{a_k}^{s_{a_k}} pa1?sa1???pa2?sa2????pak?sak??? 的形式,那么只要求出所有的 p i s i p_i^{s_i} pisi?? ,再將它們一一組合起來即可。此時存在兩個問題:
(1)如何求出階乘數的所有的 p i s i p_i^{s_i} pisi??
根據定義,一個階乘數
n ! = ∏ i = 1 n i = ∏ i = 1 n p a i 1 s a i 1 p a i 2 s a i 2 ? p a i k s a i k = p 1 ∑ i = 1 n s i 1 p 2 ∑ i = 1 n s i 2 ? p r ∑ i = 1 n s i r n!=\prod\limits_{i=1}^ni=\prod\limits_{i=1}^np_{a_{i1}}^{s_{a_{i1}}}p_{a_{i2}}^{s_{a_{i2}}}\cdots p_{a_{ik}}^{s_{a_{ik}}}=p_1^{\sum\limits_{i=1}^ns_{i1}}p_2^{\sum\limits_{i=1}^ns_{i2}}\cdots p_r^{\sum\limits_{i=1}^ns_{ir}} n!=i=1n?i=i=1n?pai1?sai1???pai2?sai2????paik?saik???=p1i=1n?si1??p2i=1n?si2???pri=1n?sir??

那么對于一個質數 p p p ,只要求出 ∑ i = 1 ? n p i ? \sum\limits_{i=1}\lfloor\frac{n}{p^i}\rfloor i=1??pin?? 作為次方即可。
(2)如何求出所有的組合情況?
對于每個質數次方數 p i s i p_i^{s_i} pisi?? ,都有取或不取兩種情況,此時的組合情況數量為 2 π ( n ) 2^{\pi(n)} 2π(n) , π ( n ) \pi(n) π(n) [ 1 , n ] [1,n] [1,n] 中所有質數的數量。對于這種天文數字,我們是不可能通過暴力求解得出所有的組合情況的,那么應該如何簡化問題?考慮 s ( n ) s(n) s(n) 求的是所有獨立因數的平方和,我們可以通過生成函數的思想去得出答案,作出多項式 ∏ i = 1 ( p i 2 s i + 1 ) \prod\limits_{i=1}(p_i^{2s_i}+1) i=1?(pi2si??+1) ,不難發現這東西涵蓋了所有的組合情況,那么這個多項式最后得到的結果就是 s ( n ) s(n) s(n) 的值。此時暴力求這個連乘式就行。
結尾附上AC結果和代碼~

#include<iostream> #include<bitset> #include<vector> using namespace std; #define debug(x) cerr<<#x<<":"<<x<<endl #define debug2(x,y) cerr<<#x<<":"<<x<<" "<<#y<<":"<<y<<endl #define debug3(x,y,z) cerr<<#x<<":"<<x<<" "<<#y<<":"<<y<<" "<<#z<<":"<<z<<endl typedef long long ll; using namespace std; typedef long long ll; const ll N=1e8,M=1000000009; ll cnt=0,prime[N+1]; bitset<N+1> vis; vector<ll> pf; ll qpow(ll a,ll b){ll res=1;while(b){if(b&1) res=(res*a)%M;a=(a*a)%M;b>>=1;}return res; } void pre(){cout<<"Start!"<<endl;for(int i=2;i<=N;++i){if(!vis[i]) prime[cnt++]=i;for(int j=0;i*prime[j]<=N;++j){vis[i*prime[j]]=1;if(i%prime[j]==0) break;}} } int main(){pre();cout<<"The primes' count is "<<cnt<<endl;ll res=1;for(int i=0;i<cnt;++i){if(M%prime[i]==0) cout<<prime[i]<<endl;ll k=0,t=prime[i],tt=prime[i];while(N/t){k+=N/t;t=t*tt;}t=qpow(prime[i],k<<1ll)+1;res=t*res%M;}cout<<"The result is "<<res<<endl; }

總結

以上是生活随笔為你收集整理的欧拉计划 P429 (数论)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。