A:deco的abs 水题,先%,然后相邻两个数min()一下差值。

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=;
const int Mod=;
int a[maxn]; ll ans;
int main()
{
int N,D;
scanf("%d%d",&N,&D);
for(int i=;i<=N;i++) scanf("%d",&a[i]),a[i]%=D;
for(int i=;i<=N;i++) {
int t=abs(a[i]-a[i-]);
ans+=min(t,D-t);
}
printf("%lld\n",ans);
return ;
}

B:deco的gcd .给出数组a[],求两两gcd之积。

当然如果是两两gcd之和,就是司空见惯的反演了。

没做过的,可以参考:

HDU - 4676 :Sum Of Gcd (莫队&区间gcd公式)      CodeForces - 645F:Cowslip Collections (组合数&&欧拉函数)

1,但是这里是之积,就有点烦。 我们可以把乘法变为加法,然后反演。

2,从另外一个角度看,由于是乘法,而且是积性函数,所以我们每个素数单独考虑。对于同一个素数p,其贡献是一个取min操作, 求出每个数有多少个p,然后基数统计一下前缀和,就可以算贡献了。  注意还要欧拉降幂(我忘了降幂GG了)。

处理每个数的素数及其幂次;

1,有根号算法,单词复杂度sqrt。

2,预处理sqrt以内的素数,128个。单词复杂度128;

3,素数筛的时候记录每个数的最小素数P[i]。那么可以一直除P[i],直到为1,复杂度<18;

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int maxn=;
const int Mod=;
int vis[maxn],p[maxn],cnt,ans=,K,P[maxn];
int qpow(int a,int x){
int res=; while(x){
if(x&) res=1LL*res*a%Mod;
x>>=; a=1LL*a*a%Mod;
} return res;
}
void init()
{
for(int i=;i<maxn;i++){
if(!vis[i]) p[++cnt]=i,Mn[i]=Mod,P[i]=i;
for(int j=;j<=cnt&&i*p[j]<maxn;j++){
vis[i*p[j]]=; P[i*p[j]]=p[j];
if(!(i%p[j])) break;
}
}
}
int G[maxn][];
int main()
{
int N,Q,x;
init();
scanf("%d",&N);
rep(i,,N) {
scanf("%d",&x);
while(x>){
int t=P[x],res=;
while(x%t==) x/=t,G[t][++res]++;
}
}
rep(i,,cnt){
int sum=;
for(int j=;j<=;j++){
int t=G[p[i]][j];
if(t<=) break;
(sum+=1LL*t*(t-)/%(Mod-))%=(Mod-);
}
ans=1LL*ans*qpow(p[i],sum)%Mod;
}
printf("%d\n",ans);
return ;
}

C:deco的str

题意:S中每个位置的值val为对应区间=T的循环同构数,求相邻位置的val的积的和。

思路:如何求每个位置的值,如果对S进行循环同构,复杂度会比较高。 所以考虑对T进行M次循环同构,生成了M个新的字符串{},记录每个新的字符串出现了多少次,然后每个位置的val=对应{}中字符串的出现次数。 那么显然可以hash来做,为了保险,可以用双hash。

题解的思路: 考虑对S循环同构。  不难想到,对于一个pos,它做出贡献的形式是,S[pos+1...]+S[...pos]=T,所以我们求出每个pos和T的前缀匹配的最长公共前缀长度L[]。每个pos和T的最长后缀长度P[]。 那么pos的贡献应该是max(0,P[pos]+L[pos]-lenT); (大概是这样)。

而求L,就是exKMP;  求P,就是把T倒序,S倒叙,再求一次exKMP即可。

#include<bits/stdc++.h>
#define ull unsigned long long
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int maxn=;
const int Mod=1e9+;
int seed=; ull p[maxn],h[maxn],fcy;
char a[maxn],b[maxn]; int ans;
unordered_map<ull,int>mp;
ull gethash(int L,int R)
{
return h[R]-h[L-]*p[R-L+];
}
int main()
{
int N,M; scanf("%s%s",a+,b+);
N=strlen(a+); M=strlen(b+);
if(N<M*) return puts(""),;
p[]=; rep(i,,N) p[i]=p[i-]*seed;
rep(i,,N) h[i]=h[i-]*seed+a[i]-'a'+;
rep(i,,M) fcy=fcy*seed+b[i]-'a'+;
mp[fcy]++;
rep(i,,M) fcy=(fcy-(b[i]-'a'+)*p[M-])*seed+b[i]-'a'+,mp[fcy]++;
rep(i,,N+-M-M) {
ull A=gethash(i,i+M-),B=gethash(i+M,i+M+M-);
if(mp.find(A)==mp.end()) continue;
if(mp.find(B)==mp.end()) continue;
ans=ans+1LL*mp[A]*mp[B]%Mod;
if(ans>=Mod) ans-=Mod;
}
printf("%d\n",ans);
return ;
}

牛客NOIP暑期七天营-提高组5的更多相关文章

  1. 牛客NOIP暑期七天营-提高组1

    牛客NOIP暑期七天营-提高组1 链接 A 边权可为0就排序建一条链子. 但是边权不为0 除了第一个有0的不行. x连向上一个比他小的数. 期间判断有无解. #include <bits/std ...

  2. 牛客NOIP暑期七天营-提高组6

    目录 A-积木大赛 题目描述 link 题解 代码 B-破碎的序列 题目描述 link 题解 C-分班问题 题目描述 link 题解 比赛链接 官方题解 A-积木大赛 题目描述 link 题解 标签: ...

  3. 牛客NOIP暑期七天营-提高组5+普及组5

    ————提高组———— 第一题:deco的abs 题目链接:https://ac.nowcoder.com/acm/contest/934/A 因为每个数都可以加任意次 d ,所以可以推出 0 < ...

  4. 牛客NOIP暑期七天营-提高组3

    第一题:破碎的矩阵 题目链接:https://ac.nowcoder.com/acm/contest/932/A    刚看到这题的时候感觉特别熟悉...诶,这不就是codeforces某场比赛的某某 ...

  5. 牛客NOIP暑期七天营-提高组2

    第一题:ACGT 题目链接:https://ac.nowcoder.com/acm/contest/931/A trie树.hash.map遍历  ①.trie树上的节点多记一个rest值表示还有多少 ...

  6. 牛客NOIP暑期七天营-提高组6C:分班问题 (组合数)

    题意:A班有N个人,B班有M个人,现在要组成一个新的班级C班,为了公平,从AB班各抽相同人数的人. 现在求所有方案中,人数之和是多少. 思路:即求Σ k*C(N,k)*C(M,k);    先忽略这个 ...

  7. 牛客NOIP暑期七天营-提高组2C:滑块(平衡树) (这里rope骗分)

    A:hash 或者 map 或者trie. #include<bits/stdc++.h> #define rep(i,a,b) for(int i=a;i<=b;i++) usin ...

  8. 牛客NOIP暑期七天营-提高组1 解题报告

    https://ac.nowcoder.com/acm/contest/920#question A 构造+双指针 发现m的限制是1e5,而点数是5e4,所以不能构造太多的边,思考一下最短路树的定义. ...

  9. 牛客NOIP暑期七天营-普及组2D

    链接:https://ac.nowcoder.com/acm/contest/926/D来源:牛客网 在一维坐标系中,给定 n条有颜色的线段,第 i条线段的左右端点分别为 li​和 ri​,此外它的颜 ...

随机推荐

  1. Docker 一步搞定 ZooKeeper 集群的搭建

    Docker 一步搞定 ZooKeeper 集群的搭建 背景 原来学习 ZK 时, 我是在本地搭建的伪集群, 虽然说使用起来没有什么问题, 但是总感觉部署起来有点麻烦. 刚好我发现了 ZK 已经有了 ...

  2. Ognl 语法基础教程

    本文将力求用最简单的语言和实例,介绍一下 OGNL 的语法规则,文章主要内容参考自官方文档http://commons.apache.org/proper/commons-ognl/language- ...

  3. 根据jdk1.8源码整理而得,java集合体系(继承、实现关系)图解,超清晰,一看就懂,方便记忆

    一.前言 1. 该关系图是本人根据JDK1.8 源码整理所得,只整理了常用的.常见的集合,并非全部. 2. 整理逻辑: Collection接口下有两个子接口:List 和 Set 接口. Map是独 ...

  4. [转帖]智能合约和 DApp

    智能合约和 DApp https://www.jianshu.com/p/5e7df3902957 2018.10.08 19:50:41字数 3,403阅读 9,819 2017年11月份和2018 ...

  5. Linux文件目录指令

    1.pwd指令 pwd 显示当前所在的目录 2.ls指令 ls [选项] [目录或文件] 查看文件信息 ls -a 查看所有文件和目录,包括隐藏的 ls -l 以列表的方式显示 3.cd指令 cd 路 ...

  6. golang --for语句

    一条for 语句可以携带一条for子句. for子句可以包含初始化子句.条件子句.后置子句. package main import ( "fmt" ) func main() { ...

  7. c#栈的用法

    栈是一种重要的线性结构,栈和队列是限定插入和删除只能在表的“端点”进行的线性表 –栈的元素必须“后进先出”. –栈的操作只能在这个线性表的表尾进行. –注:对于栈来说,这个表尾称为栈的栈顶(top), ...

  8. 数据库‘master’中拒绝CREATE DATABASE权限

    今天在创建数据库的时候,遇到了没有创建数据库权限的问题,后来百度了一下解决了该问题. 1.先用windows身份验证登录,在安全性下面的找到自己创建的登录名,双击,在弹出的对话框中为它赋予权限. 2. ...

  9. c#读取数据库bool值

    数据库里bit这个布尔类型的字段,非常实用,但是在c#里读取时,许多人喜欢犯一些错误,导致运行报错. 实际中,有效的正确读取方法只有以下两种: int xxx= Convet.ToInt16(read ...

  10. 【转】socket通信-C#实现tcp收发图片音视频等字节流数据

    在日常碰到的项目中,经常碰到需要收发二进制数据的场景.比如要发送一张图片,要发送一首音频,要发送一个压缩包,要发送一个视频等等.这些数据并非字符串,而是二进制字节流数据.那么如何如何使用SharpSo ...