• 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
    ",i,Pow(i,k));
    29     ans=(ans%mod+Pow(i,k)%mod)%mod;
    30     printf("%d
    ",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
    ",(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
    ",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
    ——每当你想要放弃的时候,就想想是为了什么才一路坚持到现在。
  • 相关阅读:
    SQL Server 2005 Integration Services (SSIS)数据源之MySQL
    SQL Server 2005 Integration Services (SSIS)数据源之Sybase
    oracle10g 监听服务无法启动
    创建一个People类型,有年龄、工资、性别三个属性。 定义一个方法叫做找对象,找对象方法传过来一个人;
    基于组件的C#农历算法
    ASP.NET中实现中文简/繁体自动转换的类
    最牛的QQ资料
    单一登陆(Single Signon)问题
    Smart Client Case Study Source Code Download from MSDN China
    简历制作 | 论文资源 | 考试认证 | 招聘求职 | 文学艺术 | 外语学习
  • 原文地址:https://www.cnblogs.com/Shy-key/p/7692748.html
Copyright © 2020-2023  润新知