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?+∑1≤i<k?ak?mod?ai?+∑1≤i<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-s∑1≤i<k?ak?modai?=∑1≤i<k?(ak???ai?ak???ai?)=(k?1)ak??s
考慮如何計(jì)算s=∑1≤i<k?akai?ais=\sum_{1\leq i<k}\left \lfloor \frac{a_k}{a_i} \right \rfloor a_is=∑1≤i<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?,這個(gè)東西用樹狀數(shù)組維護(hù)一下,不太容易描述,詳細(xì)看代碼。
∑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-t∑1≤i<k?ai?modak?=∑1≤i<k?(ai???ak?ai???ak?)=∑1≤i<k?ai??t
考慮如何計(jì)算t=∑1≤i<k?aiak?akt=\sum_{1\leq i<k}\left \lfloor \frac{a_i}{a_k} \right \rfloor a_kt=∑1≤i<k??ak?ai???ak?
不但發(fā)現(xiàn)對于任意兩個(gè)數(shù)u,vu,vu,v來說有下面規(guī)律?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,u≤kv<(k+1)v
枚舉k,我們只需用統(tǒng)計(jì)出{ai,1≤i<k}\{a_i,1\leq i<k\}{ai?,1≤i<k}每段區(qū)間aia_iai?的個(gè)數(shù),就可以計(jì)算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計(jì)算s f2計(jì)算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; }總結(jié)
以上是生活随笔為你收集整理的codeforces1553 F. Pairwise Modulo(数学)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 蔚来推出婚车服务:4小时收费666元 多
- 下一篇: 科技昨夜今晨 1030:蔚来回应“NIO