小于等于x且与x互素的数的和=phi(x)*x/2,(一定有phi(x)对数,可以找到一个t,和与其对应的一个x-t)
所以 f[i]=i,
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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){;}
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }
因为操作次数不限,所以一段区间的平均值>=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具有单调性,两个指针解决
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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){;}
要求查找后缀相同的个数,可以将原字符串反过来求前缀,处理好多个字符串,用Trie树维护即可、以每两个要查找的字符串的原开头为起点,LCA的深度即为解
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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){;}