原题链接:https://www.luogu.org/problemnew/show/P4936
Agent1
题目背景
2018年11月17日,中国香港将会迎来一场XM
大战,是世界各地的ENLIGHTENED
与RESISTANCE
开战的地点,某地 的ENLIGHTENED
总部也想派Agent
去参加这次的XM
大战,与世界其他地方的ENLIGHTENED
并肩作战。
题目描述
某地的ENLIGHTENED
总部总部有
N
N
N个Agent
,每个Agent
的能力值互不相同,现在ENLIGHTENED
行动指挥想要派出
A
,
B
A,B
A,B两队Agent
去参加XM
大战。但是参加大战的两个队伍要满足两个要求:
A
A
A队中能力最大的Agent
的能力值要小于
B
B
B队能力最弱的Agent
的能力值。
A
,
B
A,B
A,B两队都要有人参战。
并不一定所有的Agent
都要去参加XM
大战的,心急的ENLIGHTENED
行动指挥想知道有多少种安排Agent
参加大战的方案。由于答案可能很大,所以只需要你求出答案模
(
1
0
9
+
7
)
(10^9+7)
(109+7)的值就可以了。
输入输出格式
输入格式:
输入仅一行,为一个整数 N N N。
输出格式:
输出答案模 ( 1 0 9 + 7 ) (10^9+7) (109+7)的值。
输入输出样例
输入样例#1:
3
输出样例#1:
5
输入样例#2:
6
输出样例#2:
129
说明
对于 20 % 20\% 20%的数据 N ≤ 10 N \leq 10 N≤10
对于 40 % 40\% 40%的数据 N ≤ 1 0 3 N \leq 10^3 N≤103
对于 60 % 60\% 60%的数据 N ≤ 1 0 5 N \leq 10^5 N≤105
对于 100 % 100\% 100%的数据 N ≤ 1 0 9 N \leq 10^9 N≤109
题解
大概是从
n
n
n个人里面先选出
2
2
2个及以上的人,然后从中间选一个点断开,我们就把人分成了两组,式子如下:
∑
i
=
1
n
(
n
i
)
(
i
−
1
)
=
∑
i
=
1
n
(
n
i
)
i
−
∑
i
=
1
n
(
n
i
)
=
n
×
2
n
−
1
−
(
2
n
−
1
)
=
(
n
−
2
)
×
2
n
−
1
+
1
\begin{aligned} &\sum_{i=1}^n\binom{n}{i}(i-1)\\ =&\sum_{i=1}^n\binom{n}{i}i-\sum_{i=1}^n\binom{n}{i}\\ =&n\times 2^{n-1}-(2^n-1)\\ =&(n-2)\times 2^{n-1}+1 \end{aligned}
===i=1∑n(in)(i−1)i=1∑n(in)i−i=1∑n(in)n×2n−1−(2n−1)(n−2)×2n−1+1
然后就变成了快速幂板子题。
代码
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int mod=1e9+7;
int n;
ll power(ll x,ll p){ll r=1;for(;p;p>>=1,x=x*x%mod)if(p&1)r=r*x%mod;return r;}
void in(){scanf("%d",&n);}
void ac(){printf("%lld",((n-2)*power(2,n-1)%mod+1)%mod);}
int main(){in(),ac();}