C - Tricolor Pyramid(卢卡斯定理)

Posted CCSU_Cola

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C - Tricolor Pyramid(卢卡斯定理)相关的知识,希望对你有一定的参考价值。

题目链接

题目:按照一定条件堆成一个塔,问塔顶颜色是什么。

条件1:两个相同颜色的方块上面放的方块颜色与其相同。

条件2:两个不相同颜色的方块上面放的方块颜色与这两个方块的颜色都不同。

思路:将三个颜色分别定位0,1,2,d1,d2方块的上方颜色一定为-(d1+d2),由此可以推出最上方的颜色为下方每个数的贡献a[i]*C((n-1),(i-1))求和,需要通过n的奇偶判断该数的正负,然后输出即可。

#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int N=400010;
int a[N];
const int mod=3;
int n;
ll qmi(ll a, ll k){
	ll res = 1;
	while(k){
		if(k & 1) res = res * a % mod;
		a = a * a % mod;
		k >>= 1;
	}
	return res;
}
ll C(ll a, ll b, ll p){
	if(b > a) return 0;
	ll res = 1;
	for(int i = 1, j =a;i<=b;i++,j--){
		res = res * j % p;
		res = res * qmi(i, p - 2) % p;
	}
	return res;
}
ll lucas(ll a, ll b, ll p){
	if(a < p && b < p) return C(a, b, p);
	return C(a % p, b % p, p) * lucas(a / p, b / p, p) % p;
}
int main(){
    scanf("%d",&n);
    getchar();
    char ch;
    for(int i=1;i<=n;i++){
        scanf("%c",&ch);
        if(ch=='B')a[i]=0;
        else if(ch=='W')a[i]=1;
        else a[i]=2;
    }
    ll ans=0;
    for(int i=1;i<=n;i++){
        ans=(ans+lucas(n-1,i-1,mod)*a[i])%mod;
    }
    if(n%2==0)ans=-ans;
    ans=(ans+mod)%mod;
    if(ans==0)printf("B\\n");
    else if(ans==1)printf("W\\n");
    else printf("R\\n");
}

卢卡斯定理求的是C(n,m)%mod当m或n大于mod的值

以上是关于C - Tricolor Pyramid(卢卡斯定理)的主要内容,如果未能解决你的问题,请参考以下文章

Lucas卢卡斯定理

卢卡斯定理

卢卡斯定理

数论篇7——组合数 & 卢卡斯定理(Lucas)

卢卡斯定理Lucas

卢卡斯定理