期望得分: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. 互评Alpha版本——杨老师粉丝群——Pinball

    一.基于NABCD评论作品,及改进建议 1.根据(不限于)NABCD评论作品的选题 (1)N(Need,需求) 成语学习对除汉语言专业外的大学生的需求并不是很高,初中生和高中生因为在升学时需要参加语文 ...

  2. 团队计划第二期Backlog

    团队计划第二期Backlog 一. 计划会议过程        今天中午我们小组就我们团队开发第二阶段的冲刺召开计划会议,总结了第一阶段开发的问题.不足和经验教训,然后对本次冲刺计划进行了合理的规划和 ...

  3. Mac安装jee开发环境,webservice环境搭建

    一.下载安装包 jdk(去官网下载) eclipse (去官网下载) tomcat(官网有9.0了)http://tomcat.apache.org/download-80.cgi#8.0.32 下载 ...

  4. EXT4.1表单提交(非AJAX)

    Ext.require([ 'Ext.form.*', 'Ext.data.*' ]); Ext.onReady(function(){ Ext.apply(Ext.form.VTypes, { re ...

  5. lintcode-424-逆波兰表达式求值

    424-逆波兰表达式求值 求逆波兰表达式的值. 在逆波兰表达法中,其有效的运算符号包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰计数表达. 样例 ["2" ...

  6. C++ Primer Plus学习:第四章

    C++入门第四章:复合类型 1 数组 数组(array)是一种数据格式,能够存储多个同类型的值. 使用数组前,首先要声明.声明包括三个方面: 存储每个元素中值的类型 数组名 数组中的元素个数 声明的通 ...

  7. (十三)Jmeter之Bean Shell 的使用(二)

    该文章来自:http://www.cnblogs.com/puresoul/p/5092628.html 上一篇Jmeter之Bean shell使用(一)简单介绍了下Jmeter中的Bean she ...

  8. Java MD5加密类

    /************************************************* md5 类实现了RSA Data Security, Inc.在提交给IETF 的RFC1321中 ...

  9. java 两个数组合并

    需求:两个字符串合并(如果想去重复,参考下一篇--数组去重复及记录重复个数) //方法一 Arrays类 String[] a = {"A","B"," ...

  10. session的基本原理

    转载:http://blog.sina.com.cn/s/blog_8155e74d0101iqmh.html 如何严格限制session在30分钟后过期! 1.设置客户端cookie的lifetim ...