2014西安现场赛F题 UVALA 7040

地址

题意:求在m种颜色中挑选k种颜色,给n个花朵涂色有几种方法。

分析:画图可以发现,基本的公式就是k ×(k-1)^(n-1)。但这仅保证了相邻颜色不同,总颜色数不超过k种,并没有保证恰好出现k种颜色;接着就是一个容斥问题,上述计算方法中包含了只含有2、3、…、(k-1)种颜色的情况,需要通过容斥原理去除。假设出现p (2 <= p <= k-1)种颜色,从k种颜色中选取p种进行涂色,方案数为C(k,p) × p × (p-1)^(n-1) ;总的方案数就是C(m,k) × ( k × (k-1)^(n-1) + ∑((-1)^p × C(k, p) × p × (p-1)^(n-1) )。

图示法:

一共8种情况,但是有两种是只有两种颜色的,需要减掉。

TLE 原因:1)逆元没有打表;2)参数传多余了,本来MOD是全局变量,但是模板上有这一项,就当参数传上了,结果就TLE了。

这是我们去年在西安现场比赛的时候做的题目,就卡在这道题目里,一直TLE了,始终没能改过来,今天题目重现了一次,仍旧TLE。。。。。。可见学新知识的时候一点也不扎实。

 1 #include <cstdio>
 2 #include <iostream>
 3 #include <sstream>
 4 #include <cmath>
 5 #include <cstring>
 6 #include <cstdlib>
 7 #include <string>
 8 #include <vector>
 9 #include <map>
10 #include <set>
11 #include <queue>
12 #include <stack>
13 #include <algorithm>
14 using namespace std;
15 #define ll long long
16 #define _cle(m, a) memset(m, a, sizeof(m))
17 #define repu(i, a, b) for(int i = a; i < b; i++)
18 #define repd(i, a, b) for(int i = b; i >= a; i--)
19 #define sfi(n) scanf("%d", &n)
20 #define pfi(n) printf("%d\n", n)
21 #define sfi2(n, m) scanf("%d%d", &n, &m)
22 #define pfi2(n, m) printf("%d %d\n", n, m)
23 #define pfi3(a, b, c) printf("%d %d %d\n", a, b, c)
24 #define MAXN 1000005
25 #define MOD 1000000007
26 const int INF = 0x3f3f3f3f;
27 ll inv[MAXN];
28 ll quickpow(ll m, ll n)
29 {
30     ll  ans = 1;
31     while(n)
32     {
33         if(n & 1)///如果n是奇数
34             ans = (ans * m) % MOD;
35         n = n >> 1;///位运算“右移1类似除2”
36         m = (m * m) % MOD;
37     }
38     return ans;
39 }
40 ll C(ll n, ll m)
41 {
42     if(m > n) return 0;
43     ll ans = 1;
44     for(int i = 1; i <= m; i++)
45     {
46         ll a = (n - m + i) % MOD;
47         ll b = i % MOD;
48         ans = ans * (a * quickpow(b, MOD - 2) % MOD) % MOD;
49     }
50     return ans;
51 }
52 ll Lucas(ll n, ll m)
53 {
54     if(m == 0) return 1;
55     else
56         return (C(n % MOD, m % MOD) * Lucas(n / MOD, m / MOD)) % MOD;
57 }
58 void get()
59 {
60     repu(i, 1, MAXN)
61     inv[i] = quickpow(i, MOD - 2);
62 }
63 ll cc[1010100];
64 int main()
65 {
66     get();
67     int T;
68     sfi(T);
69     int kase = 1;
70     ll n, m, k;
71     while(T--)
72     {
73         scanf("%lld%lld%lld", &n, &m, &k);
74         if(k==1)
75         {
76             printf("Case #%d: ",kase++);
77             if(n==1)printf("%d\n",m);
78             else printf("0\n");
79             continue ;
80         }
81         ll cmk = Lucas(m, k);
82         ll t = quickpow(k - 1, n - 1);
83         t = (t * k) % MOD;
84         int flag = 0;
85         ll cc = 1;
86         for(ll p = k - 1; p >= 2; p--)
87         {
88             cc = (((cc * (p + 1)) % MOD) * inv[k - p]) % MOD;
89             ///手残多加了个MOD也是会TLE的。。。。
90             ll q = (((cc * p) % MOD) * quickpow(p - 1, n - 1)) % MOD;
91             if(flag) t = (t + q) % MOD;
92             else t = (t - q + MOD) % MOD;
93             flag = !flag;
94         }
95         printf("Case #%d: %lld\n", kase++, (t * cmk) % MOD);
96     }
97     return 0;
98 }

时间: 2024-10-12 07:19:14

2014西安现场赛F题 UVALA 7040的相关文章

CF GYM100548 (相邻格子颜色不同的方案数 2014西安区域赛F题 容斥原理)

n个格子排成一行,有m种颜色,问用恰好k种颜色进行染色,使得相邻格子颜色不同的方案数. integers n, m, k (1 ≤n, m ≤ 10^9, 1 ≤ k ≤ 10^6, k ≤ n, m). m种颜色取k种 C(m, k) 这个可以放最后乘 那么问题就变成只用k种颜色第一个格子有k种涂法 第二个有k-1种 第三个也是k-1种 一共就是k*(k-1)^(n-1) 这种算法仅保证了相邻颜色不同,总颜色数不超过k种,并没有保证恰好出现k种颜色 也就是多算了恰好出现2种 恰好出现3种...

codeforces 100548F (西安现场赛F题):容斥原理

题目大意: 对n个排成一排的物品涂色,有m种颜色可选. 要求相邻的物品颜色不相同,且总共恰好有K种颜色,问所有可行的方案数 分析: 从m种颜色中选出k种,有c(m,k)种方法,那么我们只用考虑 k种颜色的涂法即可 显然第一个物品有k种涂法,后面的因为不能跟前面的相同都只有k-1种涂法 因此容易想到一个公式:k*(k-1)^(n-1) 但是这个公式算的是 不超过k种颜色的涂法,题目要求必须k种,怎么办呢? 先考虑一个简化版的问题: 用而且用完5种颜色涂不相关的五个物品的方案数 用阶乘的方法可以算出

hdu5074 Hatsune Miku 2014鞍山现场赛E题 水dp

http://acm.hdu.edu.cn/showproblem.php?pid=5074 Hatsune Miku Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Total Submission(s): 325    Accepted Submission(s): 243 Problem Description Hatsune Miku is a popular vi

hdu5072 Coprime 2014鞍山现场赛C题 计数+容斥

http://acm.hdu.edu.cn/showproblem.php?pid=5072 Coprime Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Total Submission(s): 354    Accepted Submission(s): 154 Problem Description There are n people standing in a

2014鞍山现场赛H题HDU5077(DFS减枝+打表)

NAND Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Total Submission(s): 65    Accepted Submission(s): 14 Problem Description Xiaoqiang entered the "shortest code" challenge organized by some self-claimed a

hdu 5078 2014鞍山现场赛 水题

http://acm.hdu.edu.cn/showproblem.php?pid=5078 现场最水的一道题 连排序都不用,因为说了ti<ti+1 //#pragma comment(linker, "/STACK:102400000,102400000") #include <cstdio> #include <cstring> #include <algorithm> #include <string> #include &l

hdu5073 2014鞍山现场赛D题

http://acm.hdu.edu.cn/showproblem.php?pid=5073 Galaxy Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Total Submission(s): 1421    Accepted Submission(s): 324 Special Judge Problem Description Good news for us: t

2014牡丹江 现场赛 F zoj 3824 Fiber-optic Network

首先赞一下题目, 好题 题意: Marjar University has decided to upgrade the infrastructure of school intranet by using fiber-optic technology. There are N buildings in the school. Each building will be installed with one router. These routers are connected by optic

ACM学习历程——HDU5017 Ellipsoid(模拟退火)(2014西安网赛K题)

---恢复内容开始--- Description Given a 3-dimension ellipsoid(椭球面) your task is to find the minimal distance between the original point (0,0,0) and points on the ellipsoid. The distance between two points (x 1,y 1,z 1) and (x 2,y 2,z 2) is defined as  Input