1 条题解
-
0

#include <cstdio> #include <iostream> using namespace std; const int M = 200005; #define int long long const int MOD = 1e9+7; int read() { int x=0,f=1;char c; while((c=getchar())<'0' || c>'9') {if(c=='-') f=-1;} while(c>='0' && c<='9') {x=(x<<3)+(x<<1)+(c^48);c=getchar();} return x*f; } int n,m,k,w,ans,c[M],dp[M][2][2],g[M],f[M];char s[M]; void work() { dp[1][0][0]=dp[1][1][1]=1; for(int i=2;i<=n;i++) { dp[i][0][0]=(dp[i-1][0][0]+dp[i-1][0][1])%MOD; dp[i][0][1]=dp[i-1][0][0]; dp[i][1][0]=(dp[i-1][1][0]+dp[i-1][1][1])%MOD; dp[i][1][1]=dp[i-1][1][0]; } ans=(dp[n][0][0]+dp[n][0][1]+dp[n][1][0])%MOD; printf("%lld\n",ans); } signed main() { n=read();m=read();scanf("%s",s+1); for(int i=1,j=1;i<=m;i=j) { j=i;while(j<=m && s[i]==s[j]) j++; c[++k]=j-i; } if(k==1) {work();return 0;} if(n&1) {puts("0");return 0;} w=c[1]+!(c[1]&1); for(int i=3;i<k;i+=2) if(c[i]&1) w=min(w,c[i]); f[0]=g[0]=1; for(int i=2;i<=n;i+=2) { f[i]=(g[i-2]+(i-w-3>=0?MOD-g[i-w-3]:0))%MOD; g[i]=(g[i-2]+f[i])%MOD; } for(int i=2;i<=min(n,w+1);i+=2) ans=(ans+f[n-i]*i)%MOD; printf("%lld\n",ans); }
- 1
信息
- ID
- 8611
- 时间
- 2000ms
- 内存
- 1024MiB
- 难度
- 10
- 标签
- 递交数
- 2
- 已通过
- 1
- 上传者