3136: [Baltic2013]brunhilda

Time Limit: 40 Sec  Memory Limit: 128 MB
Submit: 238  Solved: 73
[Submit][Status][Discuss]

Description

给定m个素数和Q个询问。每个询问有n个人,每次操作可以任意选择其中的一个素数p(素数可以重复使用),然后去掉剩余人数 mod p个人。对于每个询问,我们想知道,至少需要多少步操作才能去掉所有人。

Input

第一行:素数个数m和询问个数Q1 <= m <= 100 0001 <= Q <= 100 000)第二行:m个素数pi (2 <= pi <= 10 000 000)下面Q行:n (1 <= n <= 10 000 000

Output

Q行答案。如果无解,输出oo

Sample Input

2 2
2 3
5
6

Sample Output

3
oo

HINT

Source

 
【分析】
  40s。。你知道我有多大胆一开始还带个log做么。。。【最后T了一次,卡时过。。
  然后膜了一下栋爷爷

首先每次都去掉尽量多的人,可以证明这样贪心是最优的 
然后递推,f[i]表示i最少操作多少次到0,j表示当前离i最远的i-i%p[x]的点,f[i]=f[j]+1,如果j不满足条件了就要向后找j 
易知j一定是p[x]的倍数,预处理出每个数最小的质因数minp,对于i是不是p[x]的倍数只要看minp和i/minp是否是p[x]的倍数

时间复杂度O(n)

  那个贪心是因为f数组显然是递增的。然后我只能想到倍数之前了。

  后面那个好厉害,就是说那个j代表的质数能影响的长度不能超过这个质数本身,所以弄一个l表示那个数最远到那里。那就要看他是哪几些质数的倍数,然后选最大那个。

  就是max(l[x/mn[x]],l[mn[x]]) mn表示x的最小质因子【这里猴赛雷啊。。

 #include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define Maxn 10001000
#define Maxm 100010 inline int read()
{
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
} // int mymax(int x,int y) {return x>y?x:y;} int f[Maxn],mx;
int p[Maxm],q[Maxm]; int pri[Maxn/],pl,mn[Maxn],l[Maxn];
inline void init()
{
pl=;
memset(l,,sizeof(l));
mn[]=;
for(int i=;i<=mx;i++)
{
if(!l[i]) pri[++pl]=i,mn[i]=i;
for(int j=;j<=pl;j++)
{
if(pri[j]*i>mx) break;
mn[i*pri[j]]=pri[j];
l[i*pri[j]]=;
if(i%pri[j]==) break;
}
}
} int main()
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++) p[i]=read();
for(int i=;i<=m;i++) q[i]=read(),mx=mx>q[i]?mx:q[i];
// for(int i=1;i<=n;i++) scanf("%d",&p[i]);
// for(int i=1;i<=m;i++) scanf("%d",&q[i]);mx=mx>q[i]?mx:q[i];
init();
// memset(l,0,sizeof(l));
// memset(f,0,sizeof(f));
for(int i=;i<=mx;i++) l[i]=f[i]=;
l[]=;
for(int i=;i<=n;i++) l[p[i]]=p[i],l[]=l[]>p[i]?l[]:p[i]; int j=;
for(int i=;i<=mx;i++)
{
while(!l[j]||i-j>=l[j])
{
j++;
if(i==j) {mx=i-;break;}
}
f[i]=f[j]+;
// l[i]=mymax(l[i/mn[i]],l[mn[i]]);
l[i]=l[i/mn[i]]>l[mn[i]]?l[i/mn[i]]:l[mn[i]];
}
for(int i=;i<=m;i++)
{
if(q[i]>mx) printf("oo\n");
else printf("%d\n",f[q[i]]);
}
return ;
}

【那些20几秒咋做的啊?

2017-03-26 21:57:30

【BZOJ 3136】 3136: [Baltic2013]brunhilda (数论?)的更多相关文章

  1. 【BZOJ】【2219】数论之神

    中国剩余定理+原根+扩展欧几里得+BSGS 题解:http://blog.csdn.net/regina8023/article/details/44863519 新技能get√: LL Get_yu ...

  2. Bzoj 3505: [Cqoi2014]数三角形 数论

    3505: [Cqoi2014]数三角形 Time Limits: 1000 ms  Memory Limits: 524288 KB  Detailed Limits   Description

  3. bzoj 3834 [Poi2014]Solar Panels 数论分块

    3834: [Poi2014]Solar Panels Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 367  Solved: 285[Submit] ...

  4. 「BZOJ 2440」完全平方数「数论分块」

    题意 \(T\)组数据,每次询问第\(k\)个无平方因子的数(\(1\)不算平方因子),\(T\leq 50,k\leq 10^9\) 题解 \(k\)的范围很大,枚举肯定不行,也没什么奇妙性质,于是 ...

  5. BZOJ 3601: 一个人的数论

    题目链接:www.lydsy.com/JudgeOnline/problem.php?id=3601 题意: 思路: 因此可以用高斯消元得到ai. const int mod=1000000007; ...

  6. bzoj 2242 [SDOI2011]计算器(数论知识)

    Description 你被要求设计一个计算器完成以下三项任务: 1.给定y,z,p,计算Y^Z Mod P 的值: 2.给定y,z,p,计算满足xy≡ Z ( mod P )的最小非负整数: 3.给 ...

  7. bzoj 2226: [Spoj 5971] LCMSum 数论

    2226: [Spoj 5971] LCMSum Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 578  Solved: 259[Submit][St ...

  8. BZOJ 2301: [HAOI2011]Problem b( 数论 )

    和POI某道题是一样的...  http://www.cnblogs.com/JSZX11556/p/4686674.html 只需要二维差分一下就行了. 时间复杂度O(MAXN + N^1.5) - ...

  9. BZOJ 4305: 数列的GCD( 数论 )

    对于d, 记{ai}中是d的倍数的数的个数为c, 那么有: 直接计算即可,复杂度O(NlogN+MlogM) --------------------------------------------- ...

随机推荐

  1. 《JavaScript 实战》:实现拖放(Drag & Drop)效果

    拖放效果,也叫拖拽.拖动,学名Drag-and-drop ,是最常见的js特效之一.如果忽略很多细节,实现起来很简单,但往往细节才是难点所在.这个程序的原型是在做图片切割效果的时候做出来的,那时参考了 ...

  2. 【BZOJ4565】【HAOI2016】字符合并 [状压DP][区间DP]

    字符合并 Time Limit: 20 Sec  Memory Limit: 256 MB[Submit][Status][Discuss] Description 有一个长度为 n 的 01 串,你 ...

  3. 【BZOJ】1875: [SDOI2009]HH去散步 矩阵快速幂

    [题意]给定n个点m边的无向图,求A到B恰好经过t条边的路径数,路径须满足每条边都和前一条边不同.n<=20,m<=60,t<=2^30. [算法]矩阵快速幂 [题解]将图的邻接矩阵 ...

  4. yii2 自动登录解读

    今日遇到一个需要将当前用户,全部登出系统(YII2框架制作)重新登录的需求 仔细回忆一遍,Yii2的登录流程,竟然有些不太明白,于是下午空闲时 重新看了下Yii2的用户登录源码 文件位于YII2项目下 ...

  5. bzoj 1143 二分图最大独立集

    我们可以将一个点拆成两个点x,y,那么如果存在一条i->j的路径,我们就连接xi,yj,那么答案就是n-最大匹配数. 因为i->j所以对于i与j只能选一个,那么我们只需要求出来二分图的最大 ...

  6. C - Contest Setting Gym - 101982C dp 补题

    题目链接:https://vjudge.net/contest/273260#problem/C 学习了一下别人的思路,首先去重,然后离散化. dp数组开二维,每一次更新,状态转移方程,dp[ i ] ...

  7. 二、python框架相关知识体系

    Django框架 1.django框架.flask框架和Tornado框架的区别? django框架,内置组件多,自身功能强大,是一个大而全的框架,ORM.Admin.中间件.Form.ModelFr ...

  8. 深度学习方法(九):自然语言处理中的Attention Model注意力模型

    欢迎转载,转载请注明:本文出自Bin的专栏blog.csdn.NET/xbinworld. 技术交流QQ群:433250724,欢迎对算法.技术感兴趣的同学加入. 上一篇博文深度学习方法(八):Enc ...

  9. Jury Jeopardy(反向模拟)

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAy8AAAI7CAIAAABqfzNeAAAgAElEQVR4nOy9e2AU1d3/f2ov07q166

  10. csu 1549: Navigition Problem(几何,模拟)

    1549: Navigition Problem Time Limit: 1 Sec  Memory Limit: 256 MBSubmit: 305  Solved: 90[Submit][Stat ...