牛客——小w的禁忌与小G的长诗(容斥原理)

小w的禁忌与小G的长诗


题目描述

自从上次小w被奶牛踹了之后,就一直对此耿耿于怀。
于是"cow"成为了小w的禁忌,而长得和"cow"很像的"owc"…凡是同时含有"c",“w”,"o"的都进入了他的禁忌名单。
小G想给他送一幅幅长为n个字符的长诗,但是又怕触犯他的禁忌。所以他决定要是诗中出现了他的禁忌就宁可不送,可是…他一写起诗来就忘了一切。
小G想知道他有多少种的诗可能不触犯他的禁忌
注:小G只会用小写字母写诗

输入描述:

一行一个整数n表示诗的长度

输出描述:

一行一个整数表示小G有多少种可能的诗不触犯小W的禁忌,由于可能数也许过大,请对 1 0 9 + 7 10^9+7 109+7取膜后输出

输入

3

输出

17570

说明

n=3且包含"c",“o”,"w"的只有6个串,所以答案是26^3-6=17570

备注:

对于 30 % 30\% 30%的数据满足 1 ≤ n ≤ 5 1\leq n\leq 5 1n5
对于 100 % 100\% 100%的数据满足 1 ≤ n ≤ 1 0 5 1≤n≤10^5 1n105

解决思路:容斥原理

提示:简记容斥原理:奇加偶减。
已知:需要求解的是不含"c",“o”,"w"的字符串的数量。
计算贡献:将题目要求换一种表述方式。
求解的个数:不含"c"或者不含"o"或者不含"w"的字符串的数量。
咦!这不就是容斥原理等式的左边吗?
So
不含"c"或者不含"o"或者不含"w"的数量 = = = 不含"c"的数量 + + + 不含"o"的数量 + + + 不含"w"的数量 − - 不含"c"并且不含"o"的数量 − - 不含"o"并且不含"w"的数量 − - 不含"c"并且不含"w"的数量 + + + 不含"c"并且不含"o"并且不含"w"的数量。
由于不含一个字母的个数都相同,不含两个字母的个数也相同。
所以等式变为:
不含"c"或者不含"o"或者不含"w"的数量 = = = 3 × \times ×不含"c"的数量 − - 3 × \times ×不含"c"并且不含"o"的数量 + + + 不含"c"并且不含"o"并且不含"w"的数量。

代码

#include
#include
#include
using namespace std;

#define mod 1000000007
typedef long long ll;
const int N = 1e5 + 10;

ll qpow(ll a, ll b, ll p) {
     
	ll res = 1;
	while (b) {
     
		if (b & 1) {
     
			res = res * a % p;
		}
		a = a * a % p;
		b >>= 1;
	}
	return res;
}


int main() {
     

	int n; cin >> n;

	ll ans = 3LL * qpow(25, n, mod) % mod - 3 * qpow(24, n, mod) % mod + qpow(23, n, mod);
	ans = (ans % mod + mod) % mod;
	cout << ans << endl;
	return 0;
}

你可能感兴趣的:(组合数学)