#include<bits/stdc++.h>
using namespace std;
const long long mod = 998244353;
string s;
int a[300007];
long long x[7],y[7];
int main(){
int n;
cin>>n;
cin>>s;
int len=s.size();
for(int i=0;i<len;++i){
if(s[i]=='B')
a[i]=1;
else if(s[i]=='G')
a[i]=2;
}
long long ans=1;
for(int i=2;i<=n;++i)
ans=1ll*ans*i%mod;//每三个球可以分配给n~1个人。
for(int i=0;i<len;++i){//遇到第一种颜色的球,记录它的个数,当遇到另一种颜色的时候从第一种颜色的球中任选一个,同时记录第二种颜色的球的个数,当遇到第三种颜色的时候,从第二种颜色的球中任选一个。
//这里第一种颜色的球的个数是用x[a[i]]存的,第二种颜色的球的个数是存在y[(a[i]+1or2)%3]中的,当遇到第三种颜色即(a[i]+1or2)%3时从第二种颜色的球中任选一个
if(y[a[i]])//i前面有y[a[i]]个(a[i]+2)%3颜色的球,遇到i时前面可以从y[a[i]]个中选取一个
ans=ans*y[a[i]]--%mod;
else if(x[(a[i]+1)%3])//和下一个else if等价,另两种颜色地位相同,遇到哪一种都可以组合,三种颜色都是等价的
ans=ans*x[(a[i]+1)%3]--%mod,y[(a[i]+2)%3]++;//前面有x[(a[i]+1)%3]个(a[i]+1)%3颜色的球,遇到i时可以从x[(a[i]+1)%3]个中选取一个
else if(x[(a[i]+2)%3])//和上一个else if等价,另两种颜色地位相同,遇到哪一种都可以组合,三种颜色都是等价的
ans=ans*x[(a[i]+2)%3]--%mod,y[(a[i]+1)%3]++;//前面有x[(a[i]+2)%3]个(a[i]+2)%3颜色的球,遇到i时可以从x[(a[i]+2)%3]个中选取一个
else
x[a[i]]++;//记录当前a[i]颜色的球的数量
}
cout<<ans;
return 0;
}

Atcoder Grand Contest 037B(DP,组合数学,思维)的更多相关文章

  1. Atcoder Grand Contest 031C(构造,思维,异或,DFS)

    #include<bits/stdc++.h>using namespace std;int n,a,b,sum;void dfs(int x,int y,int ban){    if( ...

  2. Atcoder Grand Contest 024 E - Sequence Growing Hard(dp+思维)

    题目传送门 典型的 Atcoder 风格的计数 dp. 题目可以转化为每次在序列中插入一个 \([1,k]\) 的数,共操作 \(n\) 次,满足后一个序列的字典序严格大于前一个序列,问有多少种操作序 ...

  3. AtCoder Grand Contest 019 B - Reverse and Compare【思维】

    AtCoder Grand Contest 019 B - Reverse and Compare 题意:给定字符串,可以选定任意i.j且i<=j(当然i==j时没啥卵用),然后翻转i到j的字符 ...

  4. AtCoder Grand Contest 009

    AtCoder Grand Contest 009 A - Multiple Array 翻译 见洛谷 题解 从后往前考虑. #include<iostream> #include< ...

  5. AtCoder Grand Contest 008

    AtCoder Grand Contest 008 A - Simple Calculator 翻译 有一个计算器,上面有一个显示按钮和两个其他的按钮.初始时,计算器上显示的数字是\(x\),现在想把 ...

  6. AtCoder Grand Contest 007

    AtCoder Grand Contest 007 A - Shik and Stone 翻译 见洛谷 题解 傻逼玩意 #include<cstdio> int n,m,tot;char ...

  7. AtCoder Grand Contest 005

    AtCoder Grand Contest 005 A - STring 翻译 给定一个只包含\(ST\)的字符串,如果出现了连续的\(ST\),就把他删去,然后所有位置前移.问最后剩下的串长. 题解 ...

  8. Atcoder Grand Contest 036 D - Negative Cycle

    Atcoder Grand Contest 036 D - Negative Cycle 解题思路 在某些情况下,给一张图加或删一些边要使图合法的题目要考虑到最短路的差分约束系统.这一题看似和最短路没 ...

  9. AtCoder Grand Contest 012

    AtCoder Grand Contest 012 A - AtCoder Group Contest 翻译 有\(3n\)个人,每一个人有一个强大值(看我的假翻译),每三个人可以分成一组,一组的强大 ...

随机推荐

  1. CentOS6.5_x64卸载系统原有MySQL

    1.查看系统是否存在MySQL的版本 rpm -qa | grep mysql 2.删除老版本的开头文件和库(rpm -e --nodeps XXX) rpm -e --nodeps mysql-5. ...

  2. php从接口获取数据转成可以用的数组或其他(含转换编码)

    程序开发,时常会用到将接口的json数据转换成程序可以用的,因为今天看到一个比较好的程序,贴上来,以备随时查看: /** * 将对象转成数组,并按要求转换编码 * * @param array $ar ...

  3. Git创建和删除标签

    创建标签 标签是一个让人容易记住的有意义的名字,它跟某个commit绑在一起.在Git中打标签非常简单,首先,切换到需要打标签的分支上,然后,敲命令git tag <name>就可以打一个 ...

  4. NLP开源工具

    最近有人问我几次NLP有哪些开源工具,这里做个笔记.

  5. HDU 4825 Xor Sum(字典树)

    嗯... 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4825 这道题更明确的说是一道01字典树,如果ch[u][id^1]有值,那么就向下继续查找/ ...

  6. P1598

    无语的是,我以为题目条件的‘在任何一行末尾不要打印不需要的多余空格’意思是每一行都只能到最后一个 '*' 出现就换行,然后用了 '\b',结果怎么都不过,于是看了题解,发现别人都没管这个 = =!!, ...

  7. 连接数据库报错Access denied for user 'root'@'localhost' (using password:YES)

    报错信息为:pymysql.err.OperationalError: (1045, "Access denied for user 'root'@'localhost' (using pa ...

  8. DataFrame loc和iloc的区别

    loc loc是select by label(name) loc函数是选择dataframe中那一行的index == k的 iloc loc是select by position loc函数是选择 ...

  9. 吴裕雄 python 神经网络——TensorFlow TFRecord样例程序

    import numpy as np import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_dat ...

  10. IKAnalyzer使用

    1.分析器 所有分析器最终继承的类都是Analyzer 1.1 默认标准分析器:StandardAnalyzer 在我们创建索引的时候,我们使用到了IndexWriterConfig对象,在我们创建索 ...