myee
2023-04-25 13:44:56
怎么题解里全是 dp。
这里有一个比较套路的 GF 做法。
不妨总是令第一项为
如果串
否则,环上既有
考虑怎样的序列是合法的。
假设
首先,显然有
然后,如果有
由于对于每个节点
所以其实总的限制就是
这样的方案有几种呢?设
则
设
从而答案即为
使用 MTT 即可做到
MTT 太混乱邪恶了,考虑阳间一点的推导。
由于分母的非
总复杂度
代码很好写。
const ullt Mod=1e9+7;
typedef ConstMod::mod_ullt<Mod>modint;
typedef std::vector<modint>modvec;
int main()
{
#ifdef MYEE
freopen("QAQ.in","r",stdin);
freopen("QAQ.out","w",stdout);
#endif
std::vector<uint>V{0};
uint n;scanf("%u",&n);
{
chr c;
do c=getchar();while(c!='R'&&c!='B');
chr o=c;
do
{
if(o==c)V.back()++;else V.push_back(0);
c=getchar();
}
while(c=='R'||c=='B');
V.pop_back();
}
if(V.empty())
{
modint a(2),b(1);
while(n--)std::swap(a+=b,b);
a.println();return 0;
}
if(n&1)return puts("0"),0;
uint d=V[0]/2;for(auto s:V)if(s&1)_min(d,s/2);
static modint P[100005];
P[0]=1,P[d+1]=-modint(d+2),P[d+2]=d+1;
for(uint i=1;i<n/2;i++)
{
P[i]+=3*P[i-1];
if(i>=2)P[i]-=2*P[i-2];
if(i>=d+2)P[i]-=P[i-d-2];
if(i>=d+3)P[i]+=P[i-d-3];
}
(P[n/2-1]*2).println();
return 0;
}