2017-10-湖南套题4

 小于等于x且与x互素的数的和=phi(x)*x/2,(一定有phi(x)对数,可以找到一个t,和与其对应的一个x-t)

所以 f[i]=i,

 1 #include <cstdio>
 2 
 3 #define LL long long
 4 inline void read(int &x)
 5 {
 6     x=0; register char ch=getchar();
 7     for(; ch>'9'||ch<'0'; ) ch=getchar();
 8     for(; ch>='0'&&ch<='9'; ch=getchar()) x=x*10+ch-'0';
 9 }
10 const int mod(998244353);
11 
12 int L,R,k,ans;
13 
14 inline int Pow(int a,int b)
15 {
16     int ret=1;
17     for(; b; b>>=1, a=(1ll*(a%mod)*(a%mod))%mod )
18         if(b&1) ret=(1ll*(ret%mod)*(a%mod))%mod;
19     return ret;
20 }
21 
22 int Presist()
23 {
24     freopen("count.in","r",stdin);
25     freopen("count.out","w",stdout);
26     read(L),read(R),read(k);
27     for(int i=L; i<=R; ++i)
28 //        printf("%d : %d\n",i,Pow(i,k));
29     ans=(ans%mod+Pow(i,k)%mod)%mod;
30     printf("%d\n",ans);
31     return 0;
32 }
33 
34 int Aptal=Presist();
35 int main(int argc,char**argv){;}
20分暴力

 1 #include <cstdio>
 2 
 3 const int Mod=998244353;
 4 const int MAXK=1000000;
 5 
 6 int L,R,k;
 7 int f[MAXK+10];
 8 int jc[MAXK+10],K[MAXK+10];
 9 int pre[MAXK+10],suf[MAXK+10];
10 
11 int power(int x,int k)
12 {
13     int ret=1;
14     while (k)
15     {
16         if (k&1) ret=1LL*ret*x%Mod;
17         x=1LL*x*x%Mod;
18         k>>=1;
19     }
20     return ret;
21 }
22 int cnt(int n)
23 {
24     if (n==0) return 0;
25     int ans=0;
26     if (n<=k+10 || n<=MAXK)
27         for (int i=1; i<=n; i++) ans=(K[i]+ans)%Mod;
28     else
29     {
30         pre[0]=1;
31         for (int i=1; i<=k+2; i++) pre[i]=1LL*pre[i-1]*(n-i)%Mod;
32         suf[k+3]=1;
33         for (int i=k+2; i>=1; i--) suf[i]=1LL*suf[i+1]*(n-i)%Mod;
34         int l=k+1,r=0,flag=((k+1)&1)?(-1):(1);
35         for (int i=1; i<=k+2; i++)
36         {
37             int s=1LL*pre[i-1]*suf[i+1]%Mod,m=1LL*(flag*jc[l]+Mod)*jc[r]%Mod;
38             ans=(1LL*f[i]*s%Mod*power(m,Mod-2)%Mod+ans)%Mod;
39             l--;
40             r++;
41             flag*=-1;
42         }
43     }
44     ans=((ans+K[2])%Mod-1+Mod)%Mod;
45     return ans;
46 }
47 void init()
48 {
49     scanf("%d%d%d",&L,&R,&k);
50     for (int i=1; i<=MAXK+5; i++) K[i]=power(i,k);
51     jc[0]=1;
52     for (int i=1; i<=k+2; i++) jc[i]=1LL*jc[i-1]*i%Mod;
53     for (int i=1; i<=k+2; i++) f[i]=(f[i-1]+K[i])%Mod;
54     printf("%d\n",(cnt(R)-cnt(L-1)+Mod)%Mod);
55     return ;
56 }
57 int main()
58 {
59     freopen("count.in","r",stdin);
60     freopen("count.out","w",stdout);
61     init();
62     fclose(stdin);
63     fclose(stdout);
64     return 0;
65 }
AC

 

 

 

 

 

因为操作次数不限,所以一段区间的平均值>=k即为一组合法解,转化为,计算a[i]-k的前缀和sum[i],区间和>=0即为合法解

设f[i]=min(j)(1<=j<=i,sum[i]-sum[j-1]>=0),显然的若存在一个k满足k<j,且sum[k]<sum[j],则j为无用决策、

用单调栈维护决策即可,sum具有单调性,两个指针解决

 1 #include <cstdio>
 2 
 3 #define max(a,b) ((a)>(b)?(a):(b))
 4 
 5 inline void read(int &x)
 6 {
 7     x=0; register char ch=getchar();
 8     for(; ch>'9'||ch<'0'; ) ch=getchar();
 9     for(; ch>='0'&&ch<='9'; ch=getchar()) x=x*10+ch-'0';
10 }
11 const int N(1e6+5);
12 long long sum[N];
13 int stack[N],top;
14 int n,m,a[N];
15 
16 inline int Query(int k)
17 {
18     int ret=0; top=1;
19     for(int i=1; i<=n; ++i)
20     {
21         sum[i]=sum[i-1]+a[i]-k;
22         if(sum[i]<sum[stack[top]]) stack[++top]=i;
23     }
24     for(int i=n; i; --i)
25     {
26         for(; top&&sum[i]>=sum[stack[top]]; ) top--;
27         ret=max(ret,i-stack[top+1]);
28     }
29     return ret;
30 }
31 
32 int Presist()
33 {
34     freopen("blocks.in","r",stdin);
35     freopen("blocks.out","w",stdout);
36     read(n),read(m);
37     for(int i=1; i<=n; ++i) read(a[i]);
38     for(int k; m--; )
39         read(k),printf("%d ",Query(k));
40     return 0;
41 }
42 
43 int Aptal=Presist();
44 int main(int argc,char**argv){;}
AC

 

 

 

 

要求查找后缀相同的个数,可以将原字符串反过来求前缀,处理好多个字符串,用Trie树维护即可、以每两个要查找的字符串的原开头为起点,LCA的深度即为解

 1 #include <cstring>
 2 #include <cstdio>
 3 
 4 #define swap(a,b) {int c=a;a=b;b=c;}
 5 
 6 const int N(1000000);
 7 char s[N];
 8 int n,m;
 9 
10 int len[N],tr[N][27],tot;
11 int dep[N],dad[N][23];
12 inline void Ins(int u)
13 {
14     int v=tot;
15     dad[v][0]=u; dep[v]=dep[u]+1;
16     for(int i=1; i<=20; ++i)
17         dad[v][i]=dad[dad[v][i-1]][i-1];
18 }
19 inline void Build(int k)
20 {
21     int l=strlen(s+1),now=0;
22     for(int x,i=l; i; --i)
23     {
24         x=s[i]-'a';
25         if(!tr[now][x]) tr[now][x]=++tot,
26         Ins(now);   now=tr[now][x];
27     }
28     len[k]=now;
29 }
30 
31 inline int LCA(int x,int y)
32 {
33     if(dep[x]>dep[y]) swap(x,y);
34     for(int i=20; i>=0; --i)
35         if(dep[dad[y][i]]>=dep[x]) y=dad[y][i];
36     if(x==y) return x;
37     for(int i=20; i>=0; --i)
38         if(dad[x][i]!=dad[y][i]) x=dad[x][i],y=dad[y][i];
39     return dad[x][0];
40 }
41 /*
42 5 5
43 zzj
44 pri
45 prime
46 ime
47 owaski
48 2 3 1 3 5
49 2 2 2 3
50 1 actri
51 2 2 3 4
52 2 3 2 6 5
53 */
54 int Presist()
55 {
56     freopen("biology.in","r",stdin);
57     freopen("biology.out","w",stdout);
58     scanf("%d%d",&n,&m);
59     for(int i=1; i<=n; ++i)    
60         scanf("%s",s+1),Build(i);
61     for(int op,t,u,v; m--; )
62     {
63         scanf("%d",&op);
64         if(op==1)
65             scanf("%s",s+1),Build(++n);
66         else
67         {
68             scanf("%d%d",&t,&u);
69             int lca=len[u];
70             for(int i=2; i<=t; ++i)
71             {
72                 scanf("%d",&v);
73                 lca=LCA(lca,len[v]);
74             }
75             printf("%d\n",dep[lca]);
76         }
77     }
78 //    for(int i=1; i<=tot; ++i) printf("%d ",dep[i]);
79     return 0;
80 }
81 
82 int Aptal=Presist();
83 int main(int argc,char**argv){;}
AC

 

posted @ 2017-10-19 15:28  Aptal丶  阅读(177)  评论(0)    收藏  举报