2020 CCPC Henan Provincial Collegiate Programming Contest I.太阳轰炸

I.太阳轰炸

分析:

由于是同心圆,所以有交集的圆的范围为 R1 + r

  • 若 R1 + r >= R2,只有消灭与未消灭两种情况
  • 其他情况有概率消灭:计算打中的概率 P ,然后二项分布求出

预处理逆元优化,不然T1

#include <bits/stdc++.h>
using namespace std;
#define mst(x, y) memset(x, y, sizeof x)
#define endl '\n'
#define INF LONG_LONG_MAX
#define pb push_back
#define x first
#define y second
#define int long long
#define Lson u << 1, l, mid
#define Rson u << 1 | 1, mid + 1, r
#define FAST ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
const int N = 5000010, MOD = 1e9 + 7;
const double EPS = 1e-6;
typedef pair<int, int> PII;
typedef unordered_map<int, int> Ump;
int T;
int n, inv;
int fact[N], infact[N];
int pp[N], qq[N];

int qmi(int a, int b)
{
    int ans = 1;
    while (b)
    {
        if (b & 1)
            ans = ans * a % MOD;
        a = a * a % MOD;
        b >>= 1;
    }
    return ans;
}

void init()
{
    fact[0] = infact[0] = 1;
    for (int i = 1; i < N - 1; i++)
    {
        fact[i] = fact[i - 1] * i % MOD;
    }
    infact[N - 2] = qmi(fact[N - 2], MOD - 2);
    for (int i = N - 3; i >= 1; i--)
    {
        infact[i] = infact[i + 1] * (i + 1) % MOD;
    }
}

int C(int a, int b)
{
    if (a < b)
        return 0;
    return fact[a] * infact[b] % MOD * infact[a - b] % MOD;
}
void solve()
{
    init();
    int r1, r2, r, a, h;
    scanf("%lld%lld%lld%lld%lld%lld", &n, &r1, &r2, &r, &a, &h);
    if (r1 + r >= r2)
    {
        if (a * n < h)
            printf("0\n");
        else
            printf("1\n");
        return ;
    }
    int x = (r1 + r) * (r1 + r) % MOD;
    int y = r2 * r2 % MOD;
    int p = x * qmi(y, MOD - 2) % MOD;
    int q = (y - x + MOD) * qmi(y, MOD - 2) % MOD;
    int k = (h + a - 1) / a;
    // printf("%lld %lld\n", p, q);

    pp[0] = qq[0] = 1;
    for (int i = 1; i <= n; i++)
    {
        pp[i] = pp[i - 1] * p % MOD;
        qq[i] = qq[i - 1] * q % MOD;
    }

    int ans = 0;
    for (int i = k; i <= n; i++)
    {
        // printf("%lld\n", C(n, i));
        int tmp = C(n, i) * pp[i] % MOD * qq[n - i] % MOD;
        ans = (ans + tmp) % MOD;
    }

    printf("%lld\n", ans);
}
signed main()
{
    solve();
    return 0;
}
posted @ 2023-03-22 21:48  347Foricher  阅读(139)  评论(0)    收藏  举报