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";
    }
}
posted @ 2018-01-07 00:17  AlvinZH  阅读(618)  评论(0编辑  收藏  举报