[BZOJ 2790]POI2012 Distance
2014-12-16 16:49
330 查看
乍一看以为是神题,想了想,原来很暴力。。。
可以看到乘和除是没有顺序关系的,那么为了我们就统一先除再乘。
假设我们已经把原数除完了变成x,那么再在x上乘一些数使得得到的数在所有书中所需的步数最小,记为min1,次小的几为min2。
预处理大法~~~~
对每个数字枚举所有约数d,更新的最小值。
在计算答案,同样枚举约数,利用min1或min2计算即可。
代码
可以看到乘和除是没有顺序关系的,那么为了我们就统一先除再乘。
假设我们已经把原数除完了变成x,那么再在x上乘一些数使得得到的数在所有书中所需的步数最小,记为min1,次小的几为min2。
预处理大法~~~~
对每个数字枚举所有约数d,更新的最小值。
在计算答案,同样枚举约数,利用min1或min2计算即可。
代码
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int INF=1e9; int check[1000005],prime[1000000],cnt,ans,i,j,tot,x,n,minx; int p[100005][10],k[100005][10],s[100005],t[100005]; int min1[1000005],min2[1000005],num1[1000005],num2[1000005]; void init(){ for (i=2;i<=1000000;i++){ if (check[i]==0) check[i]=i, prime[++tot]=i; for (j=1;j<=tot;j++){ if (i*prime[j]>1000000) break; check[i*prime[j]]=prime[j]; if (i%prime[j]==0) break; } } } void dfs(int x,int dig,int cnt){ if (x>t[i]){ if (min1[dig]>cnt){ min2[dig]=min1[dig]; num2[dig]=num1[dig]; min1[dig]=cnt; num1[dig]=i; } else if (min2[dig]>cnt){ min2[dig]=cnt; num2[dig]=i; } return; } for (int j=0;j<=k[i][x];j++){ dfs(x+1,dig,cnt-j); dig=dig*p[i][x]; } } void work(int x,int dig,int cnt){ if (x>t[i]){ if (i==num1[dig]){ if (min2[dig]+cnt<minx || (min2[dig]+cnt==minx && ans>num2[dig])){ ans=num2[dig]; minx=min2[dig]+cnt; } } else { if (min1[dig]+cnt<minx || (min1[dig]+cnt==minx && ans>num1[dig])){ ans=num1[dig]; minx=min1[dig]+cnt; } } return; } for (int j=0;j<=k[i][x];j++){ work(x+1,dig,cnt-j); dig=dig*p[i][x]; } } int main(){ //freopen("odl.in","r",stdin); //freopen("odl.out","w",stdout); init(); scanf("%d",&n); memset(min1,127/2,sizeof(min1)); memset(min2,127/2,sizeof(min2)); for (i=1;i<=n;i++){ scanf("%d",&x); s[i]=0; t[i]=0; while (x>1){ p[i][ ++t[i] ] = check[x]; k[i][ t[i] ] = 0; while (x%p[i][t[i]]==0) x/=p[i][t[i]], k[i][ t[i] ]++, s[i]++; } dfs(1,1,s[i]); } for (i=1;i<=n;i++){ minx=INF; ans=INF; work(1,1,s[i]); //printf("%d %d\n",minx,ans); printf("%d\n",ans); } return 0; }
相关文章推荐
- bzoj 2790 [Poi2012]Distance 数学
- BZOJ2790 [Poi2012]Distance
- bzoj 2790 [Poi2012] Distance 转化+调和级数
- bzoj2790 [Poi2012]A Horrible Poem(hash+枚举)
- BZOJ 2792 [POI 2012] 二分答案 解题报告
- [BZOJ2795][Poi2012]A Horrible Poem
- bzoj 2789: [Poi2012]Letters
- bzoj 2802: [Poi2012]Warehouse Store
- 【BZOJ2803】【Poi2012】Prefixuffix hash+推性质
- 【BZOJ 2791】 2791: [Poi2012]Rendezvous (环套树、树链剖分LCA)
- [Poi2012]Distance
- 【BZOJ2799】[Poi2012]Salaries 乱搞
- BZOJ2788: [Poi2012]Festival
- BZOJ2788: [Poi2012]Festival 差分约束
- 【BZOJ2803】[Poi2012]Prefixuffix 结论题
- BZOJ2803: [Poi2012]Prefixuffix
- 【BZOJ2803】[Poi2012]Prefixuffix【Hash】【单调性】
- BZOJ 2795: [Poi2012]A Horrible Poem( hash )
- BZOJ 2802: [Poi2012]Warehouse Store
- [BZOJ 2789]POI2012 Letters