等级之题N2(8.3)
题目传送门
思路
很明显的推公式:
首先根据题目很容易就可以得出这个公式
( π r 1 2 + π r 2 2 ) + 2 S = π ( r 1 + r 2 ) 2 (πr_1^2+πr_2^2)+2S=π(r_1+r_2)^2 (πr12+πr22)+2S=π(r1+r2)2
然后化简为
r = r 1 + r 2 = 2 ∗ ( S π ) 1 2 r=r_1+r_2=2*(\frac{S}{π})^\frac{1}{2} r=r1+r2=2∗(πS)21
代码
#include<cmath>
#include<cstdio>
#include<iostream>
const double pi = acos(-1.0);
using namespace std;
int main(){
double s;
cin>>s;
printf("%.3lf\n", 2*sqrt(s/pi));
return 0;
}
等级之题 N1(8.3)
题目传送门
思路
又是很明显的求递推公式
一共需要考虑三种情况(假设x为当前期望,y为下次期望)
1、黑球加一
放黑球,拿蓝球
概率:
( n + m + 1 − x − 1 ) n + m + 1 \frac{(n+m+1−x−1)}{n+m+1} n+m+1(n+m+1−x−1)
2、黑球减一
放蓝球,拿黑球
概率:
( 1 − p ) ∗ x n + m + 1 \frac{(1−p)∗x}{n+m+1} n+m+1(1−p)∗x
3、黑球不变
放蓝球,拿蓝球
n + m + 1 − x n + m + 1 \frac{n+m+1−x}{n+m+1} n+m+1n+m+1−x
放黑球,拿黑球
x ] + 1 n + m + 1 \frac{x]+1}{n+m+1} n+m+1x]+1
所以可以求得下次的期望为
y = ( x + p ) n + m n + m − 1 y=(x+p)\frac{n+m}{n+m-1} y=(x+p)n+m−1n+m
最后化简得
( b n − a n − a m ) ( n + m ) k + a ( n + m ) ( n + m + 1 ) k b ( n + m + 1 ) k \frac{(bn−an−am)(n+m)^k+a(n+m)(n+m+1)^k}{b(n+m+1)^k} b(n+m+1)k(bn−an−am)(n+m)k+a(n+m)(n+m+1)k
所以直接计算该公式即可,对于分母用逆元计算
代码
#include<cstdio>
#include<iostream>
using namespace std;
// #define TDS_ACM_LOCAL
#define ll long long
const int mod=1e9+7;
ll n, m, k, a, b;
ll quick_pow(ll a, ll b)
{
ll res = 1;
while (b)
{
if (b & 1)
res = res * a % mod;
a = a * a % mod;
b >>= 1;
}
return res;
}
void solve(){
cin>>n>>m>>k>>a>>b;
ll x=(((((b*n)%mod -(a*n)%mod -(a*m)%mod)+mod)%mod *quick_pow(n+m, k))%mod +((a*(n+m)%mod)%mod *quick_pow(n+m+1, k))%mod)%mod;
ll y=(b*quick_pow(n+m+1, k))%mod;
y=quick_pow(y,mod-2);
cout<<x*y%mod<<endl;
return ;
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
#ifdef TDS_ACM_LOCAL
freopen("D:\\VS code\\.vscode\\testall\\in.txt", "r", stdin);
freopen("D:\\VS code\\.vscode\\testall\\out.txt", "w", stdout);
#endif
solve();
return 0;
}