期望得分:20+40+100=160

实际得分:20+20+100=140

破题关键:

f(i)=i

证明:设[1,i]中与i互质的数分别为a1,a2……aφ(i)

那么 i-a1,i-a2,…… i-aφ(i) 也与i互质

所以 Σ ai = i*φ(i)- Σ ai

所以 Σ ai = i*φ(i)/2

所以 f(i)Σai / φ(i) * 2 = i

问题转化为 求 Σ i^k

用拉格朗日差值法

我是真没看懂

题解:

std:

#include <cstring>
#include <ctime>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <algorithm> using namespace std; const int Mod=;
const int MAXK=; int power(int x,int k)
{
int ret=;
while (k) {
if (k&) ret=1LL*ret*x%Mod;
x=1LL*x*x%Mod; k>>=; }
return ret;
} int k; int f[MAXK+]; int pre[MAXK+],suf[MAXK+]; int jc[MAXK+],K[MAXK+]; int cnt(int n)
{
if (n==) return ;
int ans=;
if (n<=k+ || n<=MAXK) {
for (int i=;i<=n;i++) ans=(K[i]+ans)%Mod; }
else
{
pre[]=;
for (int i=;i<=k+;i++) pre[i]=1LL*pre[i-]*(n-i)%Mod; suf[k+]=;
for (int i=k+;i>=;i--) suf[i]=1LL*suf[i+]*(n-i)%Mod; int l=k+,r=,flag=((k+)&)?(-):();
for (int i=;i<=k+;i++)
{
int s=1LL*pre[i-]*suf[i+]%Mod,m=1LL*(flag*jc[l]+Mod)*jc[r]%Mod;
ans=(1LL*f[i]*s%Mod*power(m,Mod-)%Mod+ans)%Mod;
l--; r++; flag*=-;
}
}
ans=((ans+K[])%Mod-+Mod)%Mod;
return ans;
} int L,R; void init()
{
cin>>L>>R>>k;
for (int i=;i<=MAXK+;i++) K[i]=power(i,k); jc[]=;
for (int i=;i<=k+;i++) jc[i]=1LL*jc[i-]*i%Mod;
for (int i=;i<=k+;i++) f[i]=(f[i-]+K[i])%Mod; cout<<(cnt(R)-cnt(L-)+Mod)%Mod;
return ;
} int main()
{
freopen("count.in","r",stdin);
freopen("count.out","w",stdout);
init();
fclose(stdin);
fclose(stdout);
//fprintf(stderr,"%.3lf\n",1.0*clock()/(1.0*CLOCKS_PER_SEC));
return ;
}

令b[i]=a[i]-k

令sum[i] 表示 b[i] 的前缀和

则题目转化为

最大化r-l,l r 满足 sum[r]-sum[l]>=0

令m[i] 表示r=i时,最优的l

那么枚举r,ans=max(r-m[r])

若i<j 且 sum[i]<=sum[j] 那么 i-m[i] 一定不会成为最优解

因为此时 m[i]~j 更优

去除冗余的i之后,剩余的sum[i] 单调递减

维护一个单调栈,栈内sum[i]单调递减

因为随着r的左移,l不会右移

所以维护两个指针l,r

r从n枚举到1,

在栈中找到第一个>sum[r]的sum[k]

那么l=栈中第k+1的元素

因为k以及k之前的位置,在栈中的都比sum[r]大

不在栈中的,因为栈是一个单调递减的栈,所以他们的sum也比sum[r]大

#include<cstdio>
#include<iostream>
#include<algorithm> #define N 1000002 using namespace std; int a[N];
long long b[N];
int st[N],top; void read(int &x)
{
x=; char c=getchar();
while(!isdigit(c)) c=getchar();
while(isdigit(c)) { x=x*+c-''; c=getchar();}
} int main()
{
freopen("blocks.in","r",stdin);
freopen("blocks.out","w",stdout);
int n,m,k,ans;
read(n); read(m);
for(int i=;i<=n;i++) read(a[i]);
while(m--)
{
read(k);
for(int i=;i<=n;i++) b[i]=a[i]-k+b[i-];
top=; ans=;
for(int i=;i<=n;i++)
if(!top || b[i]<b[st[top]]) st[++top]=i;
for(int i=n;i;i--)
{
while(top && b[st[top]]<=b[i]) top--;
ans=max(ans,i-st[top+]);
}
printf("%d ",ans);
}
}

hash+二分

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm> using namespace std; #define N 50001
#define M 100001
#define S 1000001 #define mod 1500007 char s[]; int tot; int has[S],bit[]; int len[N+M],R[N+M]; int w[]; void read(int &x)
{
x=; char c=getchar();
while(!isdigit(c)) c=getchar();
while(isdigit(c)) { x=x*+c-''; c=getchar(); }
} void cal(int i)
{
len[i]=strlen(s+);
R[i]=tot+len[i];
has[tot+]=s[]-'a';
for(int j=;j<=len[i];j++) has[tot+j]=(has[tot+j-]*+s[j]-'a')%mod;
tot+=len[i];
} int gethash(int i,int l,int r,int length)
{
if(R[i]-len[i]+==l) return has[r];
return (has[r]-1ll*has[l-]*bit[length]%mod+mod)%mod;
} int main()
{
freopen("biology.in","r",stdin);
freopen("biology.out","w",stdout);
int n,m;
read(n); read(m);
bit[]=;
for(int i=;i<=;i++) bit[i]=bit[i-]*%mod;
for(int i=;i<=n;i++) { scanf("%s",s+); cal(i); }
int ty,y,mi;
int l,r,mid,ans;
int st; bool ok;
while(m--)
{
read(ty);
if(ty==) { scanf("%s",s+); cal(++n); }
else
{
read(y); mi=M;
for(int i=;i<=y;i++) read(w[i]),mi=min(len[w[i]],mi);
l=,r=mi,ans=;
while(l<=r)
{
mid=l+r>>;
st=gethash(w[],R[w[]]-mid+,R[w[]],mid);
ok=true;
for(int i=;i<=y && ok;i++)
if(gethash(w[i],R[w[i]]-mid+,R[w[i]],mid)!=st) ok=false;
if(ok) ans=mid,l=mid+;
else r=mid-;
}
printf("%d\n",ans);
}
}
}

std思路:

后缀倒过来转变成前缀,然后求trie树上的LCA的深度就是答案

std:

#include <cstring>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <algorithm> using namespace std; int read()
{
int ret=;
char c=getchar(); while (c<'' || c>'') c=getchar(); while (c>='' && c<='') {
ret=ret*+c-''; c=getchar(); } return ret;
} const int MAXLOG=,MAXT=; const int MAXN=,MAXL=; int LOG[MAXL+]; int n,m,len,cnt; int pos[MAXN+]; char last[MAXN+]; struct Trie
{
int s[];
int f[MAXLOG+];
int dep;
}tr[MAXT+]; char str[MAXL+]; void insert(int x)
{
last[x]=str[len-]; int now=;
for (int i=len-;i>=;i--) {
int id=str[i]-'a';
if (!tr[now].s[id]) {
tr[now].s[id]=++cnt;
tr[cnt].f[]=now;
tr[cnt].dep=tr[now].dep+; for (int i=;i<=MAXLOG;i++) {
tr[cnt].f[i]=tr[tr[cnt].f[i-]].f[i-];
if (tr[cnt].f[i]==) break; } }
now=tr[now].s[id]; } pos[x]=now; return ;
} int up(int x,int step)
{
while (step) {
int up=LOG[step];
x=tr[x].f[up];
step-=(<<up); }
return x;
} int LCA(int x,int y)
{
if (tr[x].dep>tr[y].dep) x=up(x,tr[x].dep-tr[y].dep);
else y=up(y,tr[y].dep-tr[x].dep);
if (x== || y==)
puts("WTF??"); int k=LOG[tr[x].dep];
while (x!=y) {
while (k>= && tr[x].f[k]==tr[y].f[k]) k--;
if (k==-) return tr[x].f[];
x=tr[x].f[k]; y=tr[y].f[k]; } return x;
} void init()
{
for (int i=,now=-,next=;i<=MAXL;i++) {
if (i==next) { now++; next<<=; }
LOG[i]=now; } n=read(),m=read(); cnt=;
int sum=;
for (int i=;i<=n;i++) {
scanf("\n%s",str); len=strlen(str);
sum+=len;
insert(i); } while (m--) {
int ty=read();
if (ty==) {
scanf("%s",str); len=strlen(str);
insert(++n); }
else {
int T=read(),ans=;
while (T--) {
int x=read(); //putchar(last[x]); putchar(' ');
if (ans==) ans=pos[x];
else ans=LCA(ans,pos[x]); }
printf("%d\n",tr[ans].dep); } } return ;
} int main()
{
freopen("biology.in","r",stdin);
freopen("biology.out","w",stdout);
init();
fclose(stdin);
fclose(stdout);
return ;
}

2017 国庆湖南 Day4的更多相关文章

  1. 2017 国庆湖南 Day5

    期望得分:76+80+30=186 实际得分:72+10+0=82 先看第一问: 本题不是求方案数,所以我们不关心 选的数是什么以及的选的顺序 只关心选了某个数后,对当前gcd的影响 预处理 cnt[ ...

  2. 2017 国庆湖南 Day6

    期望得分:100+100+60=260 实际得分:100+85+0=185 二分最后一条相交线段的位置 #include<cstdio> #include<iostream> ...

  3. 2017 国庆湖南 Day1

    卡特兰数 #include<cstdio> #include<cstring> #include<algorithm> using namespace std; ] ...

  4. 2017 国庆湖南 Day3

    期望得分:100+30+60=190 实际得分:10+0+55=65 到了233 2是奇数位 或223 第2个2是偶数位就会223 .233 循环 #include<cstdio> #de ...

  5. 2017 国庆湖南Day2

    期望得分:100+30+100=230 实际得分:100+30+70=200 T3 数组开小了 ..... 记录 1的前缀和,0的后缀和 枚举第一个1的出现位置 #include<cstdio& ...

  6. 学大伟业 2017 国庆 Day1

    期望得分:100+100+20=220 实际得分:100+100+20=220 (好久没有期望==实际了 ,~\(≧▽≦)/~) 对于 a........a 如果 第1个a 后面出现的第1个b~z 是 ...

  7. 2017国庆 清北学堂 北京综合强化班 Day1

    期望得分:60+ +0=60+ 实际得分:30+56+0=86 时间规划极端不合理,T2忘了叉积计算,用解析几何算,还有的情况很难处理,浪费太多时间,最后gg 导致T3只剩50分钟,20分钟写完代码, ...

  8. 长乐国庆集训Day4

    T1 一道数论神题 题目 [题目描述] LYK有一张无向图G={V,E},这张无向图有n个点m条边组成.并且这是一张带权图,只有点权. LYK想把这个图删干净,它的方法是这样的.每次选择一个点,将它删 ...

  9. 2017.10.1 国庆清北 D1T1 zhx的字符串题

    题目背景 2017国庆清北D1T1 题目描述 你是能看到第一题的 friends 呢. ——hja 何大爷对字符串十分有研究,于是天天出字符串题虐杀 zhx.何大爷今天为 字符串定义了新的权值计算方法 ...

随机推荐

  1. Thunder团队第七周 - Scrum会议5

    Scrum会议5 小组名称:Thunder 项目名称:i阅app Scrum Master:邹双黛 工作照片: 宋雨沉迷于照相无法自拔,所以不在相片中. 参会成员: 王航:http://www.cnb ...

  2. Java中按值传递与按引用传递的区别

    值传递:(形式参数类型是基本数据类型):方法调用时,实际参数把它的值传递给对应的形式参数,形式参数只是用实际参数的值初始化自己的存储单元内容,是两个不同的存储单元,所以方法执行中形式参数值的改变不影响 ...

  3. android入门 — Activity生命周期

    Activity总共有7个回调方法,代表着不同的生命周期的环节. 1.onCreate() 在活动第一次被创建的时候调用.在这个方法中需要完成活动的初始化操作,比如说加载布局.绑定事件等. 2.onS ...

  4. 第17章 程序管理与SELinux初探

    什么是进程 触发任何一个事件时,系统都会将它定义为一个进程,并且给予这个进程一个ID,称为PID,同时依据触发这个进程的用户与相关属性关系,给予这个进程一组有效的权限设置. 进程与程序 进程:执行一个 ...

  5. WPF/MVVM快速指引

    简介 最近微软推出了UWA,又是一波新的C#+xaml学习热.好多小伙伴都对MVVM感觉很好奇,但是有些地方也有点难以理解.特意写了这边文章,希望对你有帮助. 这边文章会很长,所以我会用几个例子的形式 ...

  6. (转)elasticsearch5.2.2 压测配置

    1.elasticsearch.yml # ---------------------------------- Cluster ----------------------------------- ...

  7. Codeforces 627D Preorder Test(二分+树形DP)

    题意:给出一棵无根树,每个节点有一个权值,现在要让dfs序的前k个结点的最小值最大,求出这个值. 考虑二分答案,把>=答案的点标记为1,<答案的点标记为0,现在的任务时使得dfs序的前k个 ...

  8. Oracle 10g DG 环境搭建详解

    环境描述:线上招聘库在物理机上,需要上云主机,于是申请两台云主机:由于云主机变态性,分配的云主机具有很多局限性:1.没有/tmp,2.没有 swap 3. /home 目录非常小:于是申请两块云硬盘, ...

  9. 【Jmeter】集合点Synchronizing Timer

    集合点: 简单来理解一下,虽然我们的“性能测试”理解为“多用户并发测试”,但真正的并发是不存在的,为了更真实的实现并发这感念,我们可以在需要压力的地方设置集合点,每到输入用户名和密码登录时,所有的虚拟 ...

  10. day 008 文件操作

    08. 万恶之源-⽂文件操作本节主要内容:1. 初识⽂文件操作2. 只读(r, rb)3. 只写(w, wb)4. 追加(a, ab)5. r+读写6. w+写读7. a+写读(追加写读)8. 其他操 ...