C++ 排列弹珠

C++ 排列弹珠,c++,math,combinatorics,C++,Math,Combinatorics,有R红色弹珠、G绿色弹珠和B蓝色弹珠。有多少种方法可以将它们排列在一条线上,使相邻的两个大理石不具有相同的颜色?(R,G,B~1e5) 结果模为1e9+7 将r(r,G,B)、B(r,G,B)、G(r,G,B)定义为第一个大理石分别为红色、绿色和蓝色时排列它们的方式数。 然后r(r,G,B)=B(r-1,B,G)+G(r-1,B,G) 答案是r(r,B,G)+B(r,B,G)+G(r,B,G) 但是我们可以看到r(r,B,G)=B(B,r,G). 如果R>G+B+1,则无法安排。 然后,我用ma

有R红色弹珠、G绿色弹珠和B蓝色弹珠。有多少种方法可以将它们排列在一条线上,使相邻的两个大理石不具有相同的颜色?(R,G,B~1e5) 结果模为1e9+7

将r(r,G,B)、B(r,G,B)、G(r,G,B)定义为第一个大理石分别为红色、绿色和蓝色时排列它们的方式数。
然后r(r,G,B)=B(r-1,B,G)+G(r-1,B,G)
答案是r(r,B,G)+B(r,B,G)+G(r,B,G)
但是我们可以看到r(r,B,G)=B(B,r,G).
如果R>G+B+1,则无法安排。
然后,我用map检查r(r,G,B)是否被计算出来

这是我的代码,但如果R,G,B>=50和R,G,B~1e5,它就不能运行。如何改进

#include <iostream>
#include<map>
#define mod 1000000007

using namespace std;

map<pair<pair<int, int>, int>, int> a;

int r(int R, int G, int B){
    if (R > G+B+1) return 0;
    else if (G >= R+B+1) return 0;
    else if (B >= G+R+1) return 0;
    else if (R == 0) return 0;
    else if (a[{{R, G}, B}] != 0) return a[{{R, G}, B}];
    a[{{R, G}, B}] = (r(G, R-1, B) + r(B, R-1, G))%mod;
    return a[{{R, G}, B}];
}

int res(int R, int G, int B){
    if (2*max(R, max(G, B)) >= R+G+B+2) return 0;
    else if (max(R, max(G, B)) == 1 && min(R, min(G, B)) == 0) return R+G+B;
    return ((r(R, G, B) + r(G, R, B))%mod + r(B, G, R))%mod;
}
int main(){
    a[{{1, 1}, 1}] = 2;
    a[{{1, 0}, 1}] = 1;
    a[{{1, 1}, 0}] = 1;
    a[{{1, 0}, 0}] = 1;
    int R, G, B;
    cin >> R >> G >> B;
    cout << res(R, G, B);
}
#包括
#包括
#定义mod 100000007
使用名称空间std;
地图a;
int r(int r,int G,int B){
如果(R>G+B+1)返回0;
如果(G>=R+B+1),则返回0;
否则如果(B>=G+R+1)返回0;
如果(R==0),则返回0;
else如果(a[{R,G},B}]!=0)返回a[{R,G},B}];
a[{R,G},B}]=(R(G,R-1,B)+R(B,R-1,G))%mod;
返回a[{R,G},B}];
}
内部资源(内部资源、内部资源、内部资源){
如果(2*max(R,max(G,B))>=R+G+B+2)返回0;
否则如果(max(R,max(G,B))==1&&min(R,min(G,B))==0)返回R+G+B;
返回((r(r,G,B)+r(G,r,B))%mod+r(B,G,r))%mod;
}
int main(){
a[{1,1},1}]=2;
a[{1,0},1}]=1;
a[{1,1},0}]=1;
a[{1,0},0}]=1;
int R,G,B;
cin>>R>>G>>B;

如果R,G,B>=50和R,G,B~1e5这是什么意思?
映射a;
——如果给变量起有意义的名字,而不是像
a
@S.M这样的单字母名字,它就不能运行了。看来程序使用了太多的内存。@Jeffrey the R(R,G,B)不是答案,而是res(R,G,B) is@PaulMcKenzie我可以检查条目是否存在吗?