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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

codeforces1553 F. Pairwise Modulo(数学)

發布時間:2023/12/3 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 codeforces1553 F. Pairwise Modulo(数学) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

F. Pairwise Modulo

想到了,但又沒完全想到。。wtcl


首先 pk=pk?1+∑1≤i<kakmodai+∑1≤i<kaimodakp_k=p_{k-1}+\sum_{1\leq i<k} a_k \bmod \ a_i+\sum_{1\leq i<k} a_i \bmod \ a_kpk?=pk?1?+1i<k?ak?mod?ai?+1i<k?ai?mod?ak?

∑1≤i<kakmodai=∑1≤i<k(ak??akai?ai)=(k?1)ak?s\sum_{1\leq i<k} a_k\bmod a_i=\sum_{1\leq i<k}(a_k- \left \lfloor \frac{a_k}{a_i} \right \rfloor a_i)=(k-1)a_k-s1i<k?ak?modai?=1i<k?(ak???ai?ak???ai?)=(k?1)ak??s

考慮如何計算s=∑1≤i<k?akai?ais=\sum_{1\leq i<k}\left \lfloor \frac{a_k}{a_i} \right \rfloor a_is=1i<k??ai?ak???ai?

如果kai≤ak<(k+1)aika_i\leq a_k<(k+1)a_ikai?ak?<(k+1)ai?那么?akai?ai=kai\left \lfloor \frac{a_k}{a_i} \right \rfloor a_i=ka_i?ai?ak???ai?=kai?,這個東西用樹狀數組維護一下,不太容易描述,詳細看代碼。


∑1≤i<kaimodak=∑1≤i<k(ai??aiak?ak)=∑1≤i<kai?t\sum_{1\leq i<k} a_i \bmod a_k=\sum_{1\leq i<k}(a_i- \left \lfloor \frac{a_i}{a_k} \right \rfloor a_k)=\sum_{1\leq i<k}a_i-t1i<k?ai?modak?=1i<k?(ai???ak?ai???ak?)=1i<k?ai??t

考慮如何計算t=∑1≤i<k?aiak?akt=\sum_{1\leq i<k}\left \lfloor \frac{a_i}{a_k} \right \rfloor a_kt=1i<k??ak?ai???ak?

不但發現對于任意兩個數u,vu,vu,v來說有下面規律?uv?v=kv,u≤kv<(k+1)v\left \lfloor \frac{u}{v} \right \rfloor v=kv,u\leq kv<(k+1)v?vu??v=kv,ukv<(k+1)v

枚舉k,我們只需用統計出{ai,1≤i<k}\{a_i,1\leq i<k\}{ai?,1i<k}每段區間aia_iai?的個數,就可以計算ttt

Code

#include<bits/stdc++.h> using namespace std; using ll=long long; template <class T=int> T rd() {T res=0;T fg=1;char ch=getchar();while(!isdigit(ch)) {if(ch=='-') fg=-1;ch=getchar();}while( isdigit(ch)) res=(res<<1)+(res<<3)+(ch^48),ch=getchar();return res*fg; } const int N=300010; template <typename T=int> struct Fenwick {const int n;T t[N];Fenwick(int n):n(n){memset(t,0,sizeof t);}void add(int k,T v){for(;k<=n;k+=k&-k) t[k]+=v;}T qsum(int k){T v=0;for(;k;k-=k&-k) v+=t[k];return v;}T get(int l,int r){return qsum(r)-qsum(l-1);} }; int n; int a[N]; int main() {n=rd();for(int i=1;i<=n;i++) a[i]=rd();Fenwick<ll> f1(300000),f2(300000); //f1計算s f2計算tll pre=0,ans=0;for(int i=1;i<=n;i++){ans+=1ll*a[i]*(i-1);//s_1ans+=pre;//t_1ans-=f1.qsum(a[i]);// s_2for(int j=a[i];j<=300000;j+=a[i]){int l=j,r=min(300000,j+a[i]-1);ans-=f2.get(l,r)*j;//t_2f1.add(l,a[i]);}f2.add(a[i],1);pre+=a[i];printf("%lld%c",ans," \n"[i==n]);}return 0; }

總結

以上是生活随笔為你收集整理的codeforces1553 F. Pairwise Modulo(数学)的全部內容,希望文章能夠幫你解決所遇到的問題。

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