CF838D Airplane Arrangements


傳送門:https://www.luogu.org/problemnew/show/CF838D

 

這道題反正我自己想是毫無頭緒,最后還是聽了肖大佬的做法。

因為題中說乘客可以從前后門進來,所以我們可以把這n個作為想象成一個環,然后乘客們都從n + 1的位置出發,於是從前后門就變成了順逆時針。

很容易得出,所有方案為 [2 * (n +1)] ^ m 種,但是這其中包含了不合法方案,所以要減去不合法的情況。那么什么是不合法的情況呢?一個人轉了一圈又回到了 n + 1 號的座位,就說明他沒有找到位置,所以所有不合法的情況就是走到n + 1的情況。

然后因為每一個座位是一樣的,所以走到的合法情況的概率是等價的,都是 (n +1 - m) / (n + 1),所以最終的答案就是 [2 * (n +1)] ^ m * (n +1 - m) / (n + 1)。

化簡一下:     2 ^ m * (n +1) ^ (m - 1) * (n +1 - m)

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<algorithm>
 4 #include<cmath>
 5 #include<cstring>
 6 #include<cstdlib>
 7 #include<cctype>
 8 #include<stack>
 9 #include<queue>
10 #include<vector>
11 using namespace std;
12 #define enter printf("\n")
13 #define space printf(" ")
14 #define Mem(a) memset(a, 0, sizeof(a))
15 typedef long long ll;
16 typedef double db;
17 const int INF = 0x3f3f3f3f;
18 const db eps = 1e-8;
19 const int maxn = 6e5 + 5;
20 const ll mod = 1e9 + 7;
21 inline ll read()
22 {
23     ll ans = 0;
24     char ch = getchar(), last = ' ';
25     while(!isdigit(ch)) {last = ch; ch = getchar();}
26     while(isdigit(ch))
27     {
28         ans = ans * 10 + ch - '0'; ch = getchar();
29     }
30     if(last == '-') ans = -ans;
31     return ans;
32 }
33 inline void write(ll x)
34 {
35     if(x < 0) x = -x, putchar('-');
36     if(x >= 10) write(x / 10);
37     putchar(x % 10 + '0');
38 }
39 
40 ll n, m;
41 
42 ll quickpow(ll a, ll b)
43 {
44     a %= mod;
45     ll ret = 1;
46     while(b)
47     {
48         if(b & 1) ret = ret * a % mod;
49         a = a * a % mod; b >>= 1;
50     }
51     return ret;
52 }
53 
54 int main()
55 {
56     n = read(); m = read();
57     write(quickpow((ll)2, m) * quickpow(n + 1, m - 1) % mod * (n + 1 - m) % mod); enter;
58     return 0;
59 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM