2019.03.30【NOIP提高组】模拟 A 组

111 篇文章 0 订阅
76 篇文章 0 订阅

前言

爆零警告


JZOJ 3187 洛谷 3076 的士

分析

玄学贪心,就不放代码了


JZOJ 3188 找数

题目

找出第N个最小素因子是P的正整数


分析

首先在 p > = 1000 p>=1000 p>=1000时暴力即可,在之前可以深搜+容斥解决,二分答案


代码

#include <cstdio>
#include <cctype>
#define rr register
using namespace std;
const int inf=1000000000,N=1000000;
int n,p,v[N+1],prime[N+1],cnt; long long ans;
inline void dfs(int dep,int tot,long long mul,long long mid){
	if (dep>cnt){
		if (!tot) return;
		if (tot&1) ans-=mid/mul;
		    else ans+=mid/mul;
		return;
	}
	if (1ll*mul*prime[dep]<=mid) dfs(dep+1,tot+1,mul*prime[dep],mid);
	dfs(dep+1,tot,mul,mid);
}
signed main(){
	scanf("%d%d",&n,&p);
	for (rr int i=2;i<=N;++i){
		if (!v[i]) v[i]=prime[++cnt]=i;
		for (rr int j=1;j<=cnt&&prime[j]*i<=N;++j){
			v[i*prime[j]]=prime[j];
			if (i%prime[j]==0) break;
		}
	}
	if (p>=1000){
		rr int sum=1;
		for (ans=p;ans*p<=inf;ans+=2)
		if (v[ans]>=p){
			if ((++sum)==n) return !printf("%d",ans*p);
		}
		return !putchar(48);
	}
	while (prime[cnt]>=p) --cnt;
	rr int l=1,r=inf/p+1;
	while (l<r){
		rr int mid=(l+r)>>1; ans=mid;
		dfs(1,0,1,mid);
		if (ans>=n) r=mid;
		    else l=mid+1;
	}
	return !printf("%d\n",l*p>inf?0:l*p);
}

JZOJ 3189 解密

题目

Mirko要解一段加密文,但他只知道某一个句子是原文的一部分。你的任务是要在密文中找到第一个对应这个句子的地方。
文段是通过用某个单词(可能和原文一样的单词)替换原始文段每一个单词来加密的。如果某些单词在原文出现一次以上,就会使用相同的替换单词来替换。没有两个不同的单词使用相同的替换单词。单词是通过空格隔开的小写字母序列。句子是连续单词的序列。


分析

这道题很巧,首先处理与它最近的相同字符串的距离,没有为0,然后KMP求解,注意当距离为0时,需要特判


代码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值