/* *********************************************** Author :angon ************************************************ */ #include <stdio.h> #include <string.h> #include <iostream> #include <algorithm> #include <stack> #include <vector> #include <queue> #include <set> #include <map> #include <string> #include <math.h> #include <stdlib.h> #include <time.h> using namespace std; #define REP(i,k,n) for(int i=k;i<n;i++) #define REPP(i,k,n) for(int i=k;i<=n;i++) #define scan(d) scanf("%d",&d) #define scann(n,m) scanf("%d%d",&n,&m) #define mst(a,k) memset(a,k,sizeof(a)); #define LL long long #define maxn 1005 #define mod 100000007 int a[maxn][maxn]; int n,m,q; int t1[maxn],t2[maxn],d1[maxn],d2[maxn];//记录行列交换的位置和加的值 int main() { //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); int T; scan(T); while(T--) { scanf("%d%d%d",&n,&m,&q); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) scan(a[i][j]); for(int i=0;i<=n;i++) t1[i]=i,d1[i]=0; for(int i=0;i<=m;i++) t2[i]=i,d2[i]=0; int x,y,f; while(q--) { scanf("%d%d%d",&f,&x,&y); if(f==1) swap(t1[x],t1[y]); else if(f==2) swap(t2[x],t2[y]); else if(f==3) d1[t1[x]]+=y; else d2[t2[x]]+=y; } for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) printf("%d%c",a[t1[i]][t2[j]]+d1[t1[i]]+d2[t2[j]],j==m?'\n':' '); } return 0; }
/* *********************************************** Author :angon ************************************************ */ #include <stdio.h> #include <string.h> #include <iostream> #include <algorithm> #include <stack> #include <vector> #include <queue> #include <set> #include <map> #include <string> #include <math.h> #include <stdlib.h> #include <time.h> using namespace std; #define REP(i,k,n) for(int i=k;i<n;i++) #define REPP(i,k,n) for(int i=k;i<=n;i++) #define scan(d) scanf("%d",&d) #define scann(n,m) scanf("%d%d",&n,&m) #define mst(a,k) memset(a,k,sizeof(a)); #define LL long long #define maxn 1000005 #define mod 100000007 char s[maxn]; int vis[30]; int main() { //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); int T,n; scan(T); while(T--) { scanf("%s",s); scan(n); mst(vis,0); int len=strlen(s); int cnt=0,i=0; LL ans=0; for(int j=0;j<len;j++) { if(vis[s[j]-'a']==0) { vis[s[j]-'a']=1; cnt++; } int flag=0; if(cnt>=n) { ans+=len-j; i++; while(s[i]==s[i-1]) { ans+=len-j; i++; } for(int k=i+1;k<j;k++) { if(s[k]==s[i-1]) { flag=1; break; } } if(!flag) { cnt--; vis[s[i-1]-'a']=0; } else j--; } } printf("%I64d\n",ans); } return 0; }
#include<cstdio> #include<cstring> typedef long long ll; using namespace std; char str[1000005]; int main() { int T,k,t; ll ans; scanf("%d",&T); int vis[30]; int l,r,flag,len; while(T--) { scanf("%s%d",str,&k); l=r=0;//初始化左右指针 flag=0; ans=0; len=strlen(str); memset(vis,0,sizeof(vis)); while(l<=len-k) { while(flag<k&&r<len) { t=str[r]-'a'; if(!vis[t]) flag++;//当前已有flag个不同字符 vis[t]++; r++; }//寻找以l为起点的最小子串 if(flag==k) ans+=len-r+1;//包含最小子串的子串都满足条件 t=str[l]-'a'; vis[t]--; if(!vis[t]) flag--; l++;//起点右移 } printf("%lld\n",ans); } return 0; }
C ( n, i) * (C (n - i, (n - i) / 2) - C (n - i, (n - i) / 2 - 1) ) ;
/* *********************************************** Author :angon ************************************************ */ #include <stdio.h> #include <string.h> #include <iostream> #include <algorithm> #include <stack> #include <vector> #include <queue> #include <set> #include <map> #include <string> #include <math.h> #include <stdlib.h> #include <time.h> using namespace std; #define REP(i,k,n) for(int i=k;i<n;i++) #define REPP(i,k,n) for(int i=k;i<=n;i++) #define scan(d) scanf("%d",&d) #define scann(n,m) scanf("%d%d",&n,&m) #define mst(a,k) memset(a,k,sizeof(a)); #define LL long long #define maxn 2000005 #define mod 1000000007 LL f[maxn],rf[maxn],inv[maxn]; LL C(int n,int m) { if(n<0 || m>n) return 0; return f[n]*rf[m] % mod*rf[n-m] % mod; } int main() { inv[0]=inv[1]=1; f[0]=f[1]=rf[0]=rf[1]=1; for(int i=2;i<=maxn;i++) { f[i] = f[i-1]*i % mod; inv[i] = inv[mod%i]*(mod-mod/i)% mod; rf[i] = rf[i-1]*inv[i] % mod; } int t,n; scan(t); while(t--) { scan(n); LL ans=0; for(int i=n;i>=0;i-=2) //保证了n - i是偶数 { ans += ( C(n,i) * ( C(n-i,(n-i)/2) - C(n-i,(n-i)/2-1)+ mod ) ) % mod; } printf("%I64d\n",ans % mod); } return 0; }
C(n ,m) %M= n ! / m ! / (n-m) ! %M
预处理出 n! % M = f[n] 和 1 / m! %M = rf[m];求rf[]的时候就用到的了逆元