jzoj4010-Philips and Calculator【搜索,dp】
生活随笔
收集整理的這篇文章主要介紹了
jzoj4010-Philips and Calculator【搜索,dp】
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
正題
題目鏈接:https://jzoj.net/senior/#contest/show/3008/2
題目大意
兩個(gè)數(shù)(a,b)(a,b)(a,b),兩個(gè)操作
求ppp步以內(nèi)aaa能到達(dá)[l,r][l,r][l,r]之間的多少個(gè)數(shù)
解題思路
到達(dá)xxx的最小步驟就是將xxx分解乘若干個(gè)數(shù)的乘積,使得最大數(shù)+數(shù)的個(gè)數(shù)最小。
首先答案肯定是能被1~p1\sim ~ p1~?p之間的質(zhì)數(shù)的乘積表示出來的,發(fā)現(xiàn)這些數(shù)并不多,可以用dfsdfsdfs搜索出來并排序。
然后dpdpdp,fif_{i}fi?表示到達(dá)aia_iai?的最少操作222,然后枚舉操作111的數(shù)量進(jìn)行轉(zhuǎn)移,也就是枚舉最大數(shù)jjj,找到一個(gè)ak?j=aia_k*j=a_iak??j=ai?
然后有轉(zhuǎn)移fi=min{fi,fk+1}f_{i}=min\{f_i,f_k+1\}fi?=min{fi?,fk?+1}
時(shí)間復(fù)雜度O(3?106?n)O(3*10^6*n)O(3?106?n)
codecodecode
#pragma GCC optimize(2) %:pragma GCC optimize(3) %:pragma GCC optimize("Ofast") %:pragma GCC optimize("inline") #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N=3e6+10; int pri[25]={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97}; int l,r,P,maxx,ans,a[N],f[N],cnt,z; bool v[N]; void dfs(int x,int k){a[++cnt]=x;for(int i=k;i<=z;i++){if((long long)x*pri[i]>r) return;dfs(x*pri[i],i);} } int main() {scanf("%d%d%d",&l,&r,&P);while(z<24&&pri[z+1]<=P)z++;dfs(1,0);sort(a+1,a+1+cnt);memset(f,0x3f,sizeof(f));f[1]=0;for(int i=2;i<P;i++){int z=0;for(int j=1;j<=cnt;j++){while(a[z]*i<a[j])z++;if(a[z]*i==a[j])f[j]=min(f[j],f[z]+1);if(i+f[j]<=P)v[j]=1;}}for(int i=cnt;i>=1;i--){if(a[i]<l) break;if(v[i])ans++;}printf("%d",ans); }總結(jié)
以上是生活随笔為你收集整理的jzoj4010-Philips and Calculator【搜索,dp】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 塞尔达传说荒野之息介绍 讲解荒野之息
- 下一篇: 黄霑的简介 黄霑个人简介