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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[bzoj 4833]最小公倍佩尔数

發(fā)布時(shí)間:2023/12/15 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [bzoj 4833]最小公倍佩尔数 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

傳送門

Description?

?Let?\((1+\sqrt2)^n=e(n)+f(n)\cdot\sqrt2\)?,?both?\(e(n)\)?and?\(f(n)\)?are?integers

?Let?\(g(n)\)?be?the?gcd?of?\(f(1),f(2),...,f(n)\)

?given?\(n\),?\(p\),?where?\(p\)?is?a?prime?number

?Calculate?the?value?of?
\[ ?\sum_{i=1}^{n}i\cdot?g(i)?\?\?\?\?mod?\?p \]
?\(T\leq?210?,\sum?n\leq?3×10^6\)

Solution?

\[ f(n)=2f(n-1)+f(n-2),f(0)=1,f(1)=1 \]

?Similar?to?the?\(Fibonacci\)?sequence,?we?have
\[ ?gcd(f(a),f(b))=f(gcd(a,b)) \]
?It's?hard?to?evaluate?LCM?directly,but?we?can?get?it?by?maximum?inversion
\[ ?lcm(S)=\prod_{T?S,T≠?}gcd(T)^{(?1)^{|T|?1}} \]
?so?we?can?find?that
\[ ?g(n)=\prod_{T?S,T≠?}f(gcd(T))^{(?1)^{|T|?1}} \]
?The?next?step?is?the?most?important.

?construct?a?function?\(h\)?,which?satisfies
\[ ?f(n)=\prod_{d|n}h(d) \]
?we?can?calculate?\(h(1...n)\)?easily?by?\(O(n\log?n)\)

?and?
\[ ?\begin{equation} ?\begin{split} ?g(n)&=\prod_{d=1}^n?h(d)^{∑_{T?S,T≠?,d|gcd(T)}(?1)^{|T|+1}}\\ ?&=\prod_{d=1}^nh(d) ?\end{split} ?\end{equation} \]

?

Code?

#include<bits/stdc++.h> #define ll long long #define reg register #define db double using namespace std; inline int read() {int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}return x*f; } const int MN=1e6+5; int f[MN],h[MN],n,P,ans; int Mul(int x,int y){return 1ll*x*y%P;} int Add(int x,int y){return (x+y)%P;} int fpow(int x){int r=1,m=P-2;for(;m;m>>=1,x=Mul(x,x))if(m&1)r=Mul(r,x);return r;} int main() {int T=read();while(T--){n=read(),P=read();reg int i;f[0]=0;h[0]=h[1]=f[1]=1;for(i=2;i<=n;++i) h[i]=1,f[i]=Add(Mul(f[i-1],2),f[i-2]);for(i=2;i<=n;++i){h[i]=Mul(f[i],fpow(h[i]));for(int j=i<<1;j<=n;j+=i) h[j]=Mul(h[j],h[i]);}for(ans=0,i=1;i<=n;++i) h[i]=Mul(h[i],h[i-1]),ans=Add(ans,Mul(h[i],i));printf("%d\n",ans);}return 0; }



Blog來自PaperCloud,未經(jīng)允許,請勿轉(zhuǎn)載,TKS!

轉(zhuǎn)載于:https://www.cnblogs.com/PaperCloud/p/10955865.html

總結(jié)

以上是生活随笔為你收集整理的[bzoj 4833]最小公倍佩尔数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。