版权声明:欢迎转载,转载请注明出处,如有错误,还望指出,谢谢 博客地址:https://blog.csdn.net/lanyanzhiji123asd https://blog.csdn.net/lanyanzhiji123asd/article/details/89072528
比赛链接:https://ac.nowcoder.com/acm/contest/553#question
A:
数学题,公式算一下就行
如果是double最后精确到整数不能用强制转换
会wa到自闭
#include<bits/stdc++.h>
using namespace std;
#define ll long long
int main()
{
ll x0,y0,r,x1,y1,y2;
double AB,AL,temp,BG,DG,ans;
cin>>x0>>y0>>r>>x1>>y1>>y2;
AB=sqrt((x1-x0)*(x1-x0)+(y1-y0)*(y1-y0));
temp=(y1-y2)*1.0/x1;
AL=(y0-temp*x0-y2)/(sqrt(1+temp*temp));
// cout<<AL<<endl;
BG=sqrt(AB*AB-AL*AL);
DG=sqrt(r*r-AL*AL);
ans=(BG+DG)*(BG-DG);
printf("%.0lf\n",ans);
return 0;
}
B:
这个规律还挺好推的
每次不能超过已有的行数
那就每次复读已有的行数就是最大值
每次复读行数: 1 1 2 4 8
每次的总行数 1 2 4 8 16
所以规律就是每次都是前面的两倍
然后根据n找出次数就行
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll mp[50];
int main()
{
ll n;
int i;
mp[0]=1;
for(i=1;;i++)
{
mp[i]=2*mp[i-1];
if(mp[i]>2e9)break;
}
while(cin>>n)
{//cout<<"qqqqq "<<i<<endl;
int x=lower_bound(mp+1,mp+i,n)-mp;
cout<<x<<endl;
}
return 0;
}
D:
数学问题
正整数解就是m个数里面假设都有1
然后就是n-m分配到m个容器里面
就像是n-m个小球放进m个箱子里
非负整数解就是
n个小球放进m个箱子里
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<string>
#include<map>
#include<vector>
#include<set>
#include<queue>
#define ll long long
using namespace std;
const ll mod=1e9+7;
ll qpow(ll a,ll b, ll p)
{
ll res=1;
while(b)
{
if(b%2!=0)
{
res*=a;
res%=p;
}
a*=a;
a%=p;
b/=2;
}
return res;
}
ll c(ll n,ll m)
{
int i;
ll par=1,chi=n;
for(i=1;i<=m;i++)
{
par*=i;
if(i!=m)
chi*=(n-i);
par%=mod;
chi%=mod;
}
par=qpow(par,mod-2,mod);
return chi*par%mod;
}
int main()
{
std::ios::sync_with_stdio(false);
ll m,n;
cin>>m>>n;
cout<<c(n-1,m-1)<<" "<<c(m+n-1,m-1)<<endl;
return 0;
}
F:
题目有点难懂
就是把x加进L~R里面 X的取值和概率
已经x没加进L~R里面,X的取值和概率
最后求X的期望
然后用前缀和维护下。
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<string>
#include<map>
#include<vector>
#include<set>
#include<queue>
using namespace std;
#define ll long long
int mp[100005],qianz[100005];
int main()
{
int n,q,x,L,R,temp,i,j;
double sum1,sum2,ans;
scanf("%d %d",&n,&q);
memset(qianz,0,sizeof(qianz));
for(i=1;i<=n;i++)
{
cin>>mp[i];
qianz[i]=qianz[i-1]+mp[i];
}
for(i=0;i<q;i++)
{
temp=0;
scanf("%d %d %d",&x,&L,&R);
temp=qianz[R]-qianz[L-1];
sum1=temp*1.0/(R-L+1);
sum1*=(n-R+L-1)*1.0/n;
sum2=(temp+x)*1.0/(R-L+1);
sum2*=(R-L+1)*1.0/n;
ans=sum1+sum2;
printf("%.7f\n",ans);
}
return 0;
}