2020 CCPC Henan Provincial Collegiate Programming Contest 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;
}


浙公网安备 33010602011771号