jzoj3318-[BOI2013]Brunhilda的生日【数论】
正題
題目大意
序列aaa有mmm個質數。然后詢問一個數nnn,每次可以使n=n?n%ain=n-n\%a_{i}n=n?n%ai?
求最少操作次數。
解題思路
首先我們設fif_ifi?表示由iii變為0的最少次數,然后有動態轉移fi=min{fi?i%aj}+1f_i=min\{f_{i-i\%a_j}\}+1fi?=min{fi?i%aj??}+1
然后我們會發現fif_ifi?的具有單調性,證明:
n?n%ai=ai?nai?n-n\%a_{i}=a_i\lfloor \frac{n}{a_i}\rfloorn?n%ai?=ai??ai?n??
假設fff單調不降,i=1i=1i=1時顯然成立
ai?kai?a_i\lfloor \frac{k}{a_i}\rfloorai??ai?k??和ai?k+1ai?a_i\lfloor \frac{k+1}{a_i}\rfloorai??ai?k+1??比較
∵k+1>k\because k+1>k∵k+1>k
那么就有?k+1ai?≥?kai?\lfloor \frac{k+1}{a_i}\rfloor\geq \lfloor \frac{k}{a_i}\rfloor?ai?k+1??≥?ai?k??
因為fff單調不降
f?k+1ai?≥f?kai?f_{\lfloor \frac{k+1}{a_i}\rfloor}\geq f_{\lfloor \frac{k}{a_i}\rfloor}f?ai?k+1???≥f?ai?k???
即fk+1≥fkf_{k+1}\geq f_{k}fk+1?≥fk?
證畢
我們發現每一個fif_ifi?能更新的序列都是一段連續的序列,且是位置單調不降的。那么我們考慮計算每個fif_ifi?能更新的區間。
設fxf_xfx?能更新fkf_kfk?,那么有k≤x+numx?1k\leq x+num_x-1k≤x+numx??1因為若能更新那么有k?k%ai=ik-k\%a_i=ik?k%ai?=i且對于kkk來說xxx是最大的,那么有numxnum_xnumx?就是其中的aia_iai?。
但若k=x+numxk=x+num_xk=x+numx?那么x+numi?(x+numi)%numi=x+numix+num_i-(x+num_i)\%num_i=x+num_ix+numi??(x+numi?)%numi?=x+numi?那么就有更優的方案就不是xxx了。
codecodecode
#pragma GCC optimize(2) %:pragma GCC optimize(3) %:pragma GCC optimize("Ofast") %:pragma GCC optimize("inline") #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<queue> using namespace std; const int M=10000001,N=101000; int m,n,a[N],f[M],Q,num[M],que[N],maxn; queue<int> q; int main() {freopen("data.in","r",stdin);freopen("data.out","w",stdout);scanf("%d%d",&m,&Q);for(int i=0;i<m;i++)scanf("%d",&a[i]);for(int i=1;i<=Q;i++)scanf("%d",&que[i]),maxn=max(maxn,que[i]);memset(f,0x3f,sizeof(f));memset(num,0x3f,sizeof(num));for(int i=0;i<m;i++)for(int j=a[i];j<=maxn;j+=a[i])num[j]=a[i];q.push(0);f[0]=0;num[0]=a[m-1];int now=1;while(!q.empty()&&now<=maxn){int x=q.front();q.pop();if(num[x]>=2147483647/3) continue;int tmp=min(x+num[x]-1,maxn);for(;now<=tmp;now++)f[now]=f[x]+1,q.push(now);}for(int i=1;i<=Q;i++){if(f[que[i]]>=2147483647/3) printf("oo\n");else printf("%d\n",f[que[i]]);} }總結
以上是生活随笔為你收集整理的jzoj3318-[BOI2013]Brunhilda的生日【数论】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: P4719-[模板]动态DP【矩阵乘法,
- 下一篇: 侠盗飞车5电脑配置要求(侠盗5电脑配置)