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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

[51nod1847][算法马拉松23(飞越愚人节)F]奇怪的数学题

發(fā)布時間:2024/4/11 编程问答 63 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [51nod1847][算法马拉松23(飞越愚人节)F]奇怪的数学题 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

前言

萬年不寫公開博客了,這次填個坑

題目相關(guān)

鏈接

題目大意

∑i=1N∑j=1Nsgcd(i,j)k(mod232)\sum_{i=1}^N\sum_{j=1}^Nsgcd(i,j)^k\pmod {2^{32}}i=1N?j=1N?sgcd(i,j)k(mod232)
sgcd(i,j)為i,j的第二大公約數(shù)
特殊的,若gcd(i,j)=1,則sgcd(i,j)=0

數(shù)據(jù)范圍

n≤109,k≤50n\le10^9,k\le50n109,k50

題解

設(shè)m(x)為x的次大因數(shù),特殊的,m(1)=0
∑i=1N∑j=1Nsgcd(i,j)k=∑i=1N∑j=1Nm(gcd(i,j))k根據(jù)定義=∑g=1Nm(g)k∑i=1?Ng?∑j=1?Ng?[gcd(i,j)==1]提出gcd=∑g=1Nm(g)k(2(∑i=1?Ng?φ(i))?1)大小互換也可以所以要乘以2,并且(1,1)只能算一次所以減一=∑t=1n∑?Ng?=tm(g)k(2(∑i=1tφ(i))?1)\begin{aligned} \sum_{i=1}^N\sum_{j=1}^Nsgcd(i,j)^k&=\sum_{i=1}^N\sum_{j=1}^Nm(gcd(i,j))^k&根據(jù)定義\\ &=\sum_{g=1}^Nm(g)^k\sum_{i=1}^{\left\lfloor\frac{N}{g}\right\rfloor}\sum_{j=1}^{\left\lfloor\frac{N}{g}\right\rfloor}[gcd(i,j)==1]&提出gcd\\ &=\sum_{g=1}^Nm(g)^k\left(2\left(\sum_{i=1}^{\left\lfloor\frac{N}{g}\right\rfloor}\varphi(i)\right)-1\right)&大小互換也可以所以要乘以2,并且(1,1)只能算一次所以減一\\ &=\sum_{t=1}^n\sum_{\left\lfloor\frac{N}{g}\right\rfloor=t}m(g)^k\left(2\left(\sum_{i=1}^{t}\varphi(i)\right)-1\right)\\ \end{aligned}i=1N?j=1N?sgcd(i,j)k?=i=1N?j=1N?m(gcd(i,j))k=g=1N?m(g)ki=1?gN???j=1?gN???[gcd(i,j)==1]=g=1N?m(g)k????2????i=1?gN???φ(i)?????1????=t=1n??gN??=t?m(g)k(2(i=1t?φ(i))?1)?據(jù)gcd2(1,1)?
我們發(fā)現(xiàn),滿足條件的t只有O(n)\mathcal O(\sqrt n )O(n?)個,而最后一項可以通過杜教篩來做
容易發(fā)現(xiàn),對于同一個t,其滿足條件的g是連續(xù)的一串,那么只要對于所有滿足條件的t求∑g=1maxgm(g)k\sum_{g=1}^{maxg}m(g)^kg=1maxg?m(g)k,這個用min_25篩算
因為本質(zhì)上min25篩會枚舉最小因數(shù),所以把最小因數(shù)排除掉即可

在預(yù)處理上述運算的時候要求∑g=1ngk\sum_{g=1}^{n}g^kg=1n?gk
我們引入斯特林數(shù)
xn=∑i=0x{ni}xi↓x^n=\sum_{i=0}^x\begin{Bmatrix}n\\i\end{Bmatrix}x^{i\downarrow}xn=i=0x?{ni?}xi
證明可以點進那篇博客看
這樣的話,求sigma就是
∑x=1nxk=∑x=1n∑i=0x{ki}xi↓=∑i=0n{ki}∑x=inxi↓=∑i=0n{ki}∑x=in(xi)i!=∑i=0ni!{ki}∑x=in(xi)=∑i=0ni!{ki}(n+1i+1)=∑i=0ni!{ki}(n+1)!(i+1)!(n?i)!=∑i=0n{ki}(n+1)!(i+1)(n?i)!=∑i=0n{ki}(n+1)i+1↓i+1\begin{aligned} \sum_{x=1}^nx^k&=\sum_{x=1}^n\sum_{i=0}^x\begin{Bmatrix}k\\i\end{Bmatrix}x^{i\downarrow}\\ &=\sum_{i=0}^n\begin{Bmatrix}k\\i\end{Bmatrix}\sum_{x=i}^nx^{i\downarrow}\\ &=\sum_{i=0}^n\begin{Bmatrix}k\\i\end{Bmatrix}\sum_{x=i}^n\binom{x}{i}i!\\ &=\sum_{i=0}^ni!\begin{Bmatrix}k\\i\end{Bmatrix}\sum_{x=i}^n\binom{x}{i}\\ &=\sum_{i=0}^ni!\begin{Bmatrix}k\\i\end{Bmatrix}\binom{n+1}{i+1}\\ &=\sum_{i=0}^ni!\begin{Bmatrix}k\\i\end{Bmatrix}\frac{(n+1)!}{(i+1)!(n-i)!}\\ &=\sum_{i=0}^n\begin{Bmatrix}k\\i\end{Bmatrix}\frac{(n+1)!}{(i+1)(n-i)!}\\ &=\sum_{i=0}^n\begin{Bmatrix}k\\i\end{Bmatrix}\frac{(n+1)^{i+1\downarrow}}{i+1}\\ \end{aligned}x=1n?xk?=x=1n?i=0x?{ki?}xi=i=0n?{ki?}x=in?xi=i=0n?{ki?}x=in?(ix?)i!=i=0n?i!{ki?}x=in?(ix?)=i=0n?i!{ki?}(i+1n+1?)=i=0n?i!{ki?}(i+1)!(n?i)!(n+1)!?=i=0n?{ki?}(i+1)(n?i)!(n+1)!?=i=0n?{ki?}i+1(n+1)i+1??
此處復(fù)雜度O(k2)\mathcal O(k^2)O(k2)
總復(fù)雜度O(n34logn+nk2+n23)\mathcal O(\frac{n^{\frac34}}{log\ n }+\sqrt nk^2+n^{\frac23})O(log?nn43??+n?k2+n32?)

#include<cstdio> #include<cctype> #include<cstring> #include<algorithm> #include<cmath> #include<map> #define rg register typedef long long LL; typedef unsigned int ULL; template <typename T> inline T max(const T a,const T b){return a>b?a:b;} template <typename T> inline T min(const T a,const T b){return a<b?a:b;} template <typename T> inline void mind(T&a,const T b){a=a<b?a:b;} template <typename T> inline void maxd(T&a,const T b){a=a>b?a:b;} template <typename T> inline T abs(const T a){return a>0?a:-a;} template <typename T> inline void swap(T&a,T&b){T c=a;a=b;b=c;} template <typename T> inline T gcd(const T a,const T b){if(!b)return a;return gcd(b,a%b);} template <typename T> inline T lcm(const T a,const T b){return a/gcd(a,b)*b;} template <typename T> inline T square(const T x){return x*x;}; template <typename T> inline void read(T&x) {char cu=getchar();x=0;bool fla=0;while(!isdigit(cu)){if(cu=='-')fla=1;cu=getchar();}while(isdigit(cu))x=x*10+cu-'0',cu=getchar();if(fla)x=-x; } template <typename T> inline void printe(const T x) {if(x>=10)printe(x/10);putchar(x%10+'0'); } template <typename T> inline void print(const T x) {if(x<0)putchar('-'),printe(-x);else printe(x); } namespace du {const int MAX=2000000;bool isprime[MAX+1];int n,prime[MAX+1],primesize;LL phi[MAX+1],phi1[MAX+1];inline void getlist(const LL listsize){memset(isprime,1,sizeof(isprime));isprime[1]=0,phi[1]=1;;for(rg int i=2;i<=listsize;i++){if(isprime[i])prime[++primesize]=i,phi[i]=i-1;for(rg int j=1;j<=primesize&&(LL)i*prime[j]<=listsize;j++){isprime[i*prime[j]]=0;if(i%prime[j]==0){phi[i*prime[j]]=phi[i]*prime[j];break;}phi[i*prime[j]]=phi[i]*(prime[j]-1);}}}inline LL Val(const int x){if(x<=MAX)return phi[x];return phi1[n/x];}void pre(int ttt){n=ttt;getlist(MAX);for(rg int i=1;i<=MAX;i++)phi[i]+=phi[i-1];for(rg int i=min((int)sqrt(n),n/(MAX+1));i>=1;i--){const int u=n/i;LL res=(LL)u*(u+1)/2;int limit=sqrt(u);for(rg int j=1;j<=limit;j++)res-=Val(u/j);limit++;for(rg int j=1;limit*j<=u;j++)res-=phi[j]*((u/j)-(u/(j+1)));phi1[i]=res;}} } int n,k,part,tot,qz[700001],prime[700001],sq[700001],primesize,sum0[700001],id[700001]; inline int ck(const int x){return x<=part?x:tot-n/x+1;} ULL S[51][51],sum2[700001],sum3[700001]; LL sum1[700001]; void pre() {S[0][0]=1;for(rg int i=1;i<=k;i++)for(rg int j=1;j<=i;j++)S[i][j]=S[i-1][j-1]+j*S[i-1][j]; } inline ULL qzktime(int x) {ULL ans=0,dq=0;for(rg int i=0;i<=k;i++)for(rg int j=x-i+1;j<=x+1;j++)if(j%(i+1)==0){dq=S[k][i];for(rg int l=x-i+1;l<=x+1;l++)if(j==l)dq*=l/(i+1);else dq*=l;ans+=dq;break;}return ans; } int val[700001]; ULL R[700001],ans,QZ[700001]; ULL pow(ULL x,int y) {ULL res=1;for(;y;y>>=1,x=x*x)if(y&1)res*=x;return res; } int main() {read(n),read(k);du::pre(n),pre();part=sqrt(n);tot=primesize=0;for(rg int i=1;i<=part;i++)id[++tot]=i,sum0[tot]=i-1,sum1[tot]=((((LL)i+1)*i)>>1)-1,sum2[tot]=qzktime(i)-1,sum3[tot]=i-1;id[++tot]=n/part;if(id[tot]!=part)sum0[tot]=id[tot]-1,sum1[tot]=((LL)(((LL)id[tot]+1)*id[tot])>>1)-1,sum2[tot]=qzktime(id[tot])-1,sum3[tot]=id[tot]-1;else tot--;for(rg int i=part-1;i>=1;i--)id[++tot]=n/i,sum0[tot]=id[tot]-1,sum1[tot]=((((LL)id[tot]+1)*id[tot])>>1)-1,sum2[tot]=qzktime(id[tot])-1,sum3[tot]=id[tot]-1;for(rg int i=2;i<=part;i++)if(sum0[i]!=sum0[i-1]){const int limit=i*i;ULL I=pow(i,k);for(rg int j=tot;id[j]>=limit;j--){const int t=ck(id[j]/i);sum3[j]+=sum2[t]-QZ[primesize]-sum0[t]+primesize;sum2[j]-=(sum2[t]-QZ[primesize])*I;sum1[j]-=(sum1[t]-qz[primesize])*i;sum0[j]-=sum0[t]-primesize;}prime[++primesize]=i,sq[primesize]=i*i,qz[primesize]=qz[primesize-1]+i,QZ[primesize]=QZ[primesize-1]+I;}for(rg int i=1;i<=tot;i++)sum1[i]-=sum0[i];//printf("%lld\n",sum1[i]);//sum1為phi的前綴和for(rg int i=1;i<=part;i++)val[i]=n/i,R[i]=sum3[ck(val[i])];//printf("%d %u %lld\n",val[i],R[i],sum1[i]+1);for(rg int i=part+1;i<=tot;i++)val[i]=tot-i+1,R[i]=sum3[ck(val[i])];//printf("%d %u %lld\n",val[i],R[i],sum1[i]+1);for(rg int i=1;i<=part;i++)ans+=(R[i]-R[i+1])*(2*(ULL)du::Val(i)-1);//printf("%lld\n",sum1[i]);for(rg int i=part+1;i<=tot;i++)ans+=(R[i]-R[i+1])*(2*(ULL)du::Val(n/(tot-i+1))-1);print(ans),putchar('\n');return 0; }

后記

本題可以用min_25而不用杜教篩
但我太菜了沒有學(xué)過非遞歸min_25
QAQ

總結(jié)

以上是生活随笔為你收集整理的[51nod1847][算法马拉松23(飞越愚人节)F]奇怪的数学题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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