牛客练习赛46

A.华华教奕奕写几何

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 524288K,其他语言1048576K
64bit IO Format: %lld
题目描述
奕奕的几何很差,然而奕奕并不承认,所以华华扔给奕奕一道题目。如图:
已知大半圆的半径等于两个小半圆半径之和。若给出红色部分的面积,那么大圆的半径最小是多少呢?反正奕奕是不会的,所以现在请你回答。
输入描述:
输入一个正整数s表示红色部分的面积。
1<=s<=1e9
输出描述:
输出一个小数表示大圆的最小半径,保留三位小数

示例1
输入
2

输出
1.596

解释:很简单的数学问题,用到高中学到的均值不等式, r = r 1 + r 2 ≥ 2 ∗ r 1 ∗ r 2 r=r_1+r_2 \ge 2*\sqrt{{r_1}*{r_2}} r=r1+r22r1r2 ,由已知我们可以得到一个等式
r 1 ∗ r 2 = S π r_1*r_2=\frac{S}{\pi} r1r2=πS,所以说 a n s = 2 ∗ S π ans=2*\sqrt{\frac{S}{\pi}} ans=2πS

#include<iostream>
#include<cmath>
double PI=acos(-1.0);
using namespace std;
int main(){
    double s;cin>>s;
    printf("%.3f\n",2.0*sqrt(s/PI));
    return 0;
}

B.华华送奕奕小礼物

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 524288K,其他语言1048576K
64bit IO Format: %lld
题目描述
华华用数组a和数组b合成了矩阵c。其中a数组长度为n,b数组长度为m,c是n行m列的矩阵,且c[i][j]=a[i]*b[j]。定义矩阵的权值为矩阵中所有元素的和。然后他想把矩阵送给奕奕。然而他怕奕奕不喜欢。若矩阵的权值小于L,奕奕会讨厌它,因为奕奕不喜欢太小的数字。若矩阵的权值大于R,奕奕会生气因为奕奕不认识比R大的数字。所以奕奕只喜欢权值大于等于L并且小于等于R的矩阵。还好华华学过acm,他马上想到可以送奕奕一个子矩阵,并且他立马写程序从c矩阵中找出了所有奕奕喜欢的子矩阵。你只需要帮他算算这样的子矩阵有多少个即可。
输入描述:
第一行输入n,m,L,R。
第二行n个数表示a数组
第三行m个数表示b数组
1<=n,m<=1000,1<=L<=R<=1e18
1<=a[i],b[i]<=1e6
输出描述:
输出一个数表示子矩阵的个数

示例1
输入
3 3 3 8
3 2 3
2 3 1

输出
10

解释:设子矩阵的左上角和右下角分别是 ( x 1 , y 1 ) , ( x 2 , y 2 ) (x_1,y_1),(x_2,y_2) (x1,y1),(x2,y2),那么他的和
s u m = ( a [ x 1 ] + a [ x 1 + 1 ] . . . . . a [ x 2 ] ) ∗ ( b [ y 1 ] + b [ y 1 + 1 ] . . . . . b [ y 2 ] ) sum=(a[x_1]+a[{x_1}+1].....a[x_2])*(b[y_1]+b[{y_1}+1].....b[y_2]) sum=(a[x1]+a[x1+1].....a[x2])(b[y1]+b[y1+1].....b[y2]),所以说我们可以先处理出来每段和,然后排序,枚举每行的和,对 b b b进行二分统计数量就好了

#include<cstdio>
#include<algorithm>
#include<iostream>
using namespace std;
long long a[1003]={0},b[1003]={0};
long long sum[2][1000004]={0};
int t[2]={0};
int n=0,m=0;
long long L=0,R=0;
long long ok(long long up){
    long long ret=0;
    for(int i=0;i<t[0];i++){
        int l=-1,r=t[1]-1;
        long long x=sum[0][i];
        int mid=0;
        while(l<r){
            mid=(l+r+1)/2;
            if(x*sum[1][mid]<=up) l=mid;
            else r=mid-1;
        }
        ret+=r+1;
    }
    return ret;
}
void display(long long *A,int num){
    for(int i=0;i<num;i++) cout<<A[i]<<" ";
    cout<<endl;
}
int main(){
    scanf("%d%d%lld%lld",&n,&m,&L,&R);
    for(int i=1;i<=n;i++){
         scanf("%lld",&a[i]);a[i]+=a[i-1];
    }
    for(int i=1;i<=m;i++){
        scanf("%lld",&b[i]);b[i]+=b[i-1];
    }
    for(int i=1;i<=n;i++) for(int j=1;j<=i;j++) sum[0][t[0]++]=a[i]-a[j-1];
    for(int i=1;i<=m;i++) for(int j=1;j<=i;j++) sum[1][t[1]++]=b[i]-b[j-1];
    sort(sum[0],sum[0]+t[0]);
    sort(sum[1],sum[1]+t[1]);
    printf("%lld\n",ok(R)-ok(L-1));
    return 0;
}

C.华华跟奕奕玩游戏

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 524288K,其他语言1048576K
64bit IO Format: %lld
题目描述
有一个箱子,开始时有n个黑球,m个蓝球。每一轮游戏规则如下:
第一步:奕奕有p的概率往箱子里添加一个黑球,有(1-p)的概率往箱子里添加一个蓝球。
第二步:华华随机从箱子里取出一个球。
华华喜欢黑球,他想知道k轮游戏之后箱子里黑球个数的期望。
输入描述:
输入五个整数n,m,k,a,b。
1<=n,m<=1e6,1<=k<=1e9
其中p=ab
,且a<=b,0<=a<1e9+7,0<b<1e9+7
输出描述:
输出一个数表示k轮游戏后箱子里黑球个数的期望。
输出一个整数,为答案对1e9+7取模的结果。即设答案化为最简分式后的形式为ab
,其中a和b互质。输出整数 x 使得bx≡a(mod 1e9+7)且0≤x<1e9+7。可以证明这样的整数x是唯一的。

示例1
输入
2 2 1 1 2

输出
2

解释:推公式,
设a[i]为进行了i轮游戏黑球个数的期望,则a[0]=n。
a[i+1]=
在这里插入图片描述
化简后得 a [ i + 1 ] = ( a [ i ] + p ) ∗ n + m n + m + 1 a[i+1]=(a[i]+p)*\frac{n+m}{n+m+1} a[i+1]=(a[i]+p)n+m+1n+m
,到这里可以直接矩阵快速幂求解。也可以继续推到。令 s = n + m n + m + 1 s=\frac{n+m}{n+m+1} s=n+m+1n+m
,则
a [ 0 ] = n a[0]=n a[0]=n
a [ 1 ] = s ∗ n + p ∗ s = n ∗ s + p ∗ s a[1]=s*n+p*s=n*s+p*s a[1]=sn+ps=ns+ps
a [ 2 ] = s ∗ a [ 1 ] + p ∗ s = n ∗ s 2 + p ∗ s 2 + p ∗ s a[2]=s*a[1]+p*s=n*s^2+p*s^2+p*s a[2]=sa[1]+ps=ns2+ps2+ps
a [ 3 ] = s ∗ a [ 2 ] + p ∗ s = n ∗ s 3 + p ∗ s 3 + p ∗ s 2 + p ∗ s a[3]=s*a[2]+p*s=n*s^3+p*s^3+p*s^2+p*s a[3]=sa[2]+ps=ns3+ps3+ps2+ps
不 难 得 出 a [ k ] = n ∗ s k + p ∗ ( s 1 + s 2 + . . . + s k ) 不难得出a[k]=n*s^k+p*(s^1+s^2+...+s^k) a[k]=nsk+p(s1+s2+...+sk)

#include<iostream>
#include<cstdio>
#define mod 1000000007
#define ll long long
using namespace std;
ll ok(ll a,ll b){
    ll ret=1%mod;
    while(b){
        if(b&1) ret=ret*a%mod;
        b>>=1;a=a*a%mod;
    }
    return ret%mod;
}
ll n,m,k,a,b;
ll sum=0;
int main(){
    cin>>n>>m>>k>>a>>b;
    sum=n+m;
    k++;
    long long inv=ok(ok(sum+1,k-1),mod-2);
    long long p=a*ok(b,mod-2)%mod;
    long long X=ok(sum,k-1)*inv%mod;
    long long ret1=p*sum%mod;
    long long ret2=X*n%mod;
    long long ret3=X*p%mod*sum%mod;
    long long ret=(ret1+ret2)%mod-ret3;
    ret%=mod;ret=(ret+mod)%mod;
    cout<<ret<<endl;
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值