2016级算法期末上机-E.中等·ModricWang's Fight with DDLs II
1125 ModricWang's Fight with DDLs II
思路
圆内被划分部分数的计算方式如下:
圆内部的每一个交点都使得总份数增加了一;除此之外,每一根直线段最后抵达圆周时,总份数也增加了一。
因此:
总份数应该是 \(1+圆内部的交点数量+直线段的数量\)
直线段的数量等于 \(C_n^2\)
交点数量的求法需要一些思维量。可以把圆内部的每个交点看成是某个圆内接四边形的对角线交点,于是在n个点中,任意四个点的组合都对应了圆内部的某个交点。因此,交点数量等于 \(C_n^4\)
最后的答案就是:
\(1+C_n^2+C_n^4=\frac{1}{24}(n^4+6n^3+23n^2-18n+24)\)
时间复杂度\(O(1)\) ,空间复杂度\(O(1)\)
代码
#include <iostream>
using namespace std;
const int Mod = 100007;
long long inv24, k;
long long inv(long long a, long long m) {
if (a == 1)return 1;
return inv(m % a, m) * (m - m / a) % m;
}
int main() {
#ifdef ONLINE_JUDGE
ios_base::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
#endif
inv24 = inv(24, Mod);
cin >> k;
while (k--) {
long long n, ans;
cin >> n;
n %= Mod;
ans = n * (n + Mod - 6) % Mod;
ans = n * (ans + 23) % Mod;
ans = n * (ans + Mod - 18) % Mod;
ans = (ans + 24) % Mod;
ans = ans * inv24 % Mod;
cout << ans << "\n";
}
}