zoukankan      html  css  js  c++  java
  • 【JZOJ3318】Brunhilda的生日

    description

    除去对铁质盔甲强烈的热爱,Brunhilda是一个正常的7岁女孩。近期,她正在策划一个完美的生日派对。她发明了如下的一个游戏:所有的孩子在一个数k被宣读之前不停地跑来跑去。当这个数字k宣读后,所有的孩子将形成人数恰好为k的若干群体,且保证剩余的孩子数目小于k。最后,这不足k个的孩子将从游戏中被淘汰。紧接着,比赛将继续进行,并公布一个新的数字k。游戏将在所有的孩子都被淘汰后结束。

    Brunhilda请她的父亲Wotan在游戏中来宣读数字。Wotan不喜欢这个游戏,当然也不希望在游戏的第一轮就宣布一个正无穷(PS:宣布正无穷等于将所有的孩子都从游戏中淘汰)。 Brunhilda认为这在派对上是相当尴尬的情形,所以她给了她父亲一串共计m个素数的列表。这样,她的父亲便可以从中进行选择。当然,相同的数字在游戏中可以被多次宣读。

    Wotan想尽快结束比赛,因为他有一张他最喜欢的足球俱乐部 FC Asgard的比赛门票。不幸的是,Brunhilda不知道派对上参加游戏的孩子数目。现在,对于Q个不同的数n1,...,nQ个儿童,Wotan要预先知道他所需宣读的最少数字,以便他尽早结束游戏。


    analysis

    • (DP)?暴力?

    • (f[i])表示从后往前推(i)的最小步数

    • 那么对于(i)的某个质因子(p)(f[i])可转移到(f[i+1..i+p-1])

    • 暴力搞出每个数存在的最大质因子

    • 可以知道(f)单调不递减,于是(f)肯定是一段一段的数且相差(1)

    • 记录一下当前转移的左段点,枚举转移到可转移的右端点暴力转移

    • 每种情况只可能被一个数转移得到,那么均摊(O(n))

    • 一道傻逼题调的我自闭


    code

    #pragma GCC optimize("O3")
    #pragma G++ optimize("O3")
    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    #define MAXN 100005
    #define MAX 10000000
    #define INF 1000000007
    #define ll long long
    #define fo(i,a,b) for (ll i=a;i<=b;++i)
    #define fd(i,a,b) for (ll i=a;i>=b;--i)
    
    using namespace std;
    
    ll maxp[MAX+5];
    ll f[MAX+5],p[MAXN],ask[MAXN];
    ll n,q,mx,left;
    
    inline ll read()
    {
    	ll x=0,f=1;char ch=getchar();
    	while (ch<'0' || '9'<ch){if (ch=='-')f=-1;ch=getchar();}
    	while ('0'<=ch && ch<='9')x=x*10+ch-'0',ch=getchar();
    	return x*f;
    }
    inline ll min(ll x,ll y){return x<y?x:y;}
    int main()
    {
    	n=read(),q=read();
    	fo(i,1,n)p[i]=read(),maxp[p[i]]=p[i];
    	fo(i,1,q)mx=max(mx,ask[i]=read());
    	fo(i,1,n)for (ll j=p[i];j<=mx;j+=p[i])maxp[j]=p[i];
    	memset(f,64,sizeof(f));
    	fo(i,1,p[n]-1)f[i]=1;
    	fo(i,1,mx)
    	{
    		if (maxp[i] && f[i]<INF)
    		{
    			fo(j,max(left,i+1),min(i+maxp[i]-1,mx))f[j]=min(f[j],f[i]+1);
    		}
    		left=max(left,i+maxp[i]-1);
    	}
    	fo(i,1,q)if (f[ask[i]]>INF)printf("oo
    ");
    		else printf("%lld
    ",f[ask[i]]);
    	return 0;
    }
    
  • 相关阅读:
    Git Cannot rebase: You have unstaged changes.
    importError: DLL load failed when import matplotlib.pyplot as plt
    install tushare in python 3.6
    pd.qcut, pd.cut, df.groupby()等在分组和聚合方面的应用
    从池子里的beta看秋香, 个性迥异
    个股和股票池的beta系数的估算
    检验两个随机序列的beta系数
    spyder里的"查找文件里的特定字符串"非常方便
    地图上道路编号中的G S X Y
    场内的代码表, 感觉水很深
  • 原文地址:https://www.cnblogs.com/horizonwd/p/11153826.html
Copyright © 2011-2022 走看看