1 条题解
-
0
[NICA #3] 星空(Easy Version)(Starry Sky Easy) 题解
思路分析
将互不相同的 的幂升序排列为 。利用 的幂的性质:除最大值 外的任意两数之和满足 !
- 若 ,由于 , 必有相邻元素,和必 ,答案为 ;
- 若 ,则除 以外的任意两个元素相邻都必定合法()!唯一需要满足的约束是「与最大值 相邻的元素必须属于集合 」。设 :
- 放在首尾两端( 个位置):有 个邻居选自 ,其余 个元素任意排,共 种;
- 放在中间( 个位置):左右 个邻居有序选自 ,其余 个元素任意排,共 种。 两者相加化简得总方案数为 。时间复杂度 。
参考代码
#include <algorithm> #include <iostream> using namespace std; const long long MOD = 1000000007LL; unsigned long long a[70]; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int n; unsigned long long x; if (!(cin >> n >> x)) return 0; for (int i = 0; i < n; ++i) cin >> a[i]; sort(a, a + n); long long s = 0; for (int i = 0; i < n - 1; ++i) { if (a[n - 1] + a[i] <= x) ++s; } long long fact = 1; for (int i = 1; i <= n - 2; ++i) fact = (fact * i) % MOD; long long ans = s * (s + 1) % MOD * fact % MOD; cout << ans << "\n"; return 0; }
- 1
信息
- ID
- 8565
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- (无)
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者