[UVALive - 7040]Color [容斥 恰好k個]
阿新 • • 發佈:2018-11-09
題意: 用m種顏色染一個線性格子,相鄰格子顏色不同,問恰好染k種顏色的方案數.
至多用k個顏色的方案數目為
但是要求的是恰好k個顏色,考慮容斥
表示不用
然後考慮對立面,
可以利用遞推得到:
程式碼
/***********************************************
Author :lzs
Created Time :2018年10月19日 星期五 17時49分21秒
File Name :Color.cpp
************************************************/
#include <bits/stdc++.h>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <string>
#include <math.h>
#include <stack>
#include <vector>
#include <queue>
#include <set>
#include <map>
using namespace std;
#define rep(i, l, r) for(int i = l; i < r; i++)
#define per(i, r, l) for(int i = r; i >= l; i--)
#define dbgln(...) cerr<<"["<<#__VA_ARGS__":"<<(__VA_ARGS__)<<"]"<<"\n"
#define dbg(...) cerr<<"["<<#__VA_ARGS__":"<<(__VA_ARGS__)<<"]"
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int>pii;
const int N = (int) 1e6 + 20;
const int M = (int) 1e6 + 11;
const int MOD = (int) 1e9 + 7;
const int INF = (int) 0x3f3f3f3f;
const ll INFF = (ll) 0x3f3f3f3f3f3f3f3f;
/*-----------------------------------------------------------*/
int Pow(int a, int b, int c = MOD){
int s = 1; a %= c;
while(b){
if(b & 1) s = s * 1ll * a % c;
b >>= 1;
a = a * 1ll * a % c;
}
r