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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

LOJ #6052. 「雅礼集训 2017 Day11」DIV

發布時間:2023/12/10 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LOJ #6052. 「雅礼集训 2017 Day11」DIV 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

完了我是數學姿勢越來越弱了,感覺這種CXRdalao秒掉的題我都要做好久


一些前置推導

首先我們很容易得出\((a+bi)(c+di)=k \Leftrightarrow ac-bd=k,ad+bc=0\)

我們可以直接\(ad+bc=0\Rightarrow ad=-bc\Rightarrow \frac{a}b=-\frac{c}ozvdkddzhkzd\)

考慮把這個分數化為最簡的形式,那么就意味著我們要把\(\gcd\)拿出來

我們令\(\frac{a}b=\frac{p}{q}(\gcd(p,q)=1)\),那么\(\frac{c}d=-\frac{p}q\)

把這個代回去就有\(x(p+qi)\cdot q(p-qi)=k\)

然后直接把式子乘起來就有\(xy(p^2+q^2)=k\)

那么我們可以發現,如果\(p^2+q^2|k\),那么它就可以對答案產生貢獻

然后考慮求貢獻和,即所有是\(p^2+q^2\)倍數以及\(k\)的倍數的數的個數

假設這個數\(M=w(p^2+q^2)\),那么我們知道\(w|\frac{k}{p^2+q^2}\),可以列出貢獻的式子:

\[\sum_{w|\frac{k}{p^2+q^2}} p\cdot w=p\cdot\sigma(\frac{k}{p^2+q^2})\]

然后我們枚舉\(p,q\)后統計答案,發現不好維護,因此可以直接枚舉\(t=p^2+q^2\),則原式等于:

\[\sum_t \sum_{\gcd(p,q)=1\&\&p^2+q^2=t} p\sum_{y|k} \sigma(\frac{k}t)\]

然后我們考慮簡化這個式子,首先\(\sum_{y|k}\sigma(\frac{k}t)\)其實就是\(\sum_{i=1}^{\frac{n}t}\sigma i\)

所以我們記\(\sigma\)的前綴和為\(D\),然后為了方便把\(\sum_{\gcd(p,q)=1\&\&p^2+q^2=t} p\)設為\(F\),這樣原式即為:

\[\sum_{d=1}^n F(d)\cdot D(\frac{n}d)\]

是我們熟悉的除法分塊形式,所以考慮分別求出\(D,F\)的值,由于這里的數據范圍比較大所以我們考慮用杜教篩


求解\(D\)

先講比較簡單的\(D\)的求解,首先如果是小范圍我們可以直接用線性篩篩出單個的\(\sigma\)然后做前綴和

然后有一個很簡單的結論,我們可以直接暴力枚舉約數算個數,即:

\[D(n)=\sum_{i=1}^n\sigma(i)=\sum_{d=1}^n d\cdot\lfloor\frac{n}d\rfloor\]

這個直接除法分塊一下,然后總體就是\(O(n^{\frac{2}3})\)


求解\(F\)

首先還是小范圍答案,我們可以線性篩出素數的時候直接枚舉\(p,q\)然后算貢獻即可

我們考慮對\(F\)做前綴和,即令\(G(n)=\sum_{p^2+q^2\le n} p=\sum_{p=1}^{\lfloor\sqrt n\rfloor} p\cdot \lfloor \sqrt{n-p^2}\rfloor\)

考慮直接枚舉\(\gcd(p,q)\),那么即有:

\[G(n)=\sum_{d\ge 1} d\cdot F(\lfloor\frac{n}{d^2}\rfloor)\]

根據杜教篩的套路,我們直接把\(d=1\)的情況提出來,那么就有:

\[G(n)=F(n)+\sum_{d\ge 2} d\cdot F(\lfloor\frac{n}{d^2}\rfloor)\]

即得到\(F(n)=G(n)-\sum_{d\ge 2} d\cdot F(\lfloor\frac{n}{d^2}\rfloor)\)

這里由于求解單個\(G\)\(\sqrt n\)的,因此總體復雜度還是\(n^{\frac{2}3}\)


綜上,我們總算是把這道杜教篩的練手題做完了,然后我把一個\(x\)打成\(n\)調了一晚上233

CODE

#include<cstdio> #include<map> #include<cmath> #define RI register int #define CI const int& using namespace std; typedef long long LL; const int N=5000000,mod=1004535809,inv2=502267905; int prime[N+5],cnt,ans; bool vis[N+5]; LL n,ds[N+5],fs[N+5]; map <LL,int> _ds,_fs; inline void inc(LL& x,const LL y) {if ((x+=y)>=mod) x-=mod; } inline void inc(int& x,CI y) {if ((x+=y)>=mod) x-=mod; } inline void dec(int& x,CI y) {if ((x-=y)<0) x+=mod; } inline int sum(CI x,CI y) {int t=x+y; return t>=mod?t-mod:t; } inline int sub(CI x,CI y) {int t=x-y; return t<0?t+mod:t; } inline int gcd(CI x,CI y) {return y?gcd(y,x%y):x; } inline int Sum(const LL& l,const LL& r) {return ((l+r)%mod)*((r-l+1)%mod)%mod*inv2%mod; } #define Pi prime[j] inline void init(CI n) {RI i,j; ds[1]=vis[1]=1; for (i=2;i<=n;++i){if (!vis[i]) prime[++cnt]=i,ds[i]=i+1;for (j=1;j<=cnt&&i*Pi<=n;++j){vis[i*Pi]=1; if (i%Pi) ds[i*Pi]=ds[i]*(Pi+1);else { ds[i*Pi]=ds[i]*(Pi+1)-Pi*ds[i/Pi]; break; }}}for (i=1;i*i<=n;++i){int t=i*i; for (j=1;j*j+t<=n;++j) if (gcd(i,j)==1) fs[j*j+t]+=i;}for (i=1;i<=n;++i) ds[i]%=mod,fs[i]%=mod,inc(ds[i],ds[i-1]),inc(fs[i],fs[i-1]); } #undef Pi inline int Ds(const LL& x) {if (x<=N) return ds[x]; if (_ds.count(x)) return _ds[x]; int ret=0;for (LL l=1,r;l<=x;l=r+1) r=x/(x/l),inc(ret,1LL*Sum(l,r)*((x/r)%mod)%mod); return _ds[x]=ret; } inline int Fs(const LL& x) {if (x<=N) return fs[x]; if (_fs.count(x)) return _fs[x]; int ret=0; register LL i; for (i=1;i*i<=x;++i) inc(ret,i*((LL)floor(sqrt(x-i*i))%mod)%mod);for (i=2;i*i<=x;++i) dec(ret,i*Fs(x/(i*i))%mod); return _fs[x]=ret; } int main() {scanf("%lld",&n); init(N); for (LL l=1,r;l<=n;l=r+1)r=n/(n/l),inc(ans,1LL*sub(Fs(r),Fs(l-1))*Ds(n/l)%mod);return printf("%d",sum(sum(ans,ans),Ds(n))),0; }

轉載于:https://www.cnblogs.com/cjjsb/p/10738752.html

總結

以上是生活随笔為你收集整理的LOJ #6052. 「雅礼集训 2017 Day11」DIV的全部內容,希望文章能夠幫你解決所遇到的問題。

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