天天看點

2019西北工業大學程式設計創新實踐基地春季選拔賽(重制賽) 部分題解

A.Chino with Geometry

Chino的數學很差,是以Cocoa非常擔心。這一天,Cocoa準備教Chino學習圓與直線的位置關系。

衆所周知,直線和圓有三種位置關系:相離、相切、相割,主要根據圓心到直線的距離來判定。 現在我們來看看作業吧:

2019西北工業大學程式設計創新實踐基地春季選拔賽(重制賽) 部分題解

圓A是以整點為圓心、正整數為半徑的圓,整點分别是圓外一點以及軸上的一點,形成一條圓的割線(也就是和圓有兩個交點)。現在Cocoa想要知道,的值是多少?

題目對于Chino來說太難啦,你能幫一幫Chino嗎?

輸入描述:

六個正整數x0, y0, r, x1, y1, y2

輸出描述:

題目要求的答案,精确到整數

示例1

輸入

2 2 1 3 1 2

輸出

1

題解:數學題,推了好久太浪費時間,太菜了…

過點A對直線BC作垂線于O,連接配接AE AD AB, 直角三角形AEO和直角三角形AOB兩組勾股定理聯立就能得出BD*BE =(x1-x0) * (x1-x0)+(y1-y0) * (y1-y0)-r * r

AC代碼:

#include<iostream>
using namespace std;
typedef long long ll;
int main()
{
	 ll x0,y0,r,x1,y1,y2;
	 cin>>x0>>y0>>r>>x1>>y1>>y2;
	 cout<<(x1-x0)*(x1-x0)+(y1-y0)*(y1-y0)-r*r<<endl;
	 return 0;
 } 
           

B.Chino with Repeater

Chino的數學很差,是以Cocoa非常擔心。今天,Cocoa準備教Chino數數。

我們都知道人類的本質之一是複讀機,而複讀機就是複讀别人說過的話。

現在有下面這段程式: #include <stdio.h> // 包含标準庫的資訊

main() // 定義名為main的函數,它不接受參數值

{ // main函數的語句都被括在花括号中

printf(“Hello, world!”); // main函數調用庫函數printf以顯示字元串序列

} 顯然,它的功能是列印一行.

現在,Cocoa想要知道,如果一台複讀機每次可以複讀若幹行(但不超過已有的行數),那麼最少複讀幾次可以讓消息記錄達到行呢?

題目對Chino來說太難啦,你能幫一幫Chino嗎?

輸入描述:

一個正整數n

輸出描述:

題目中要求的答案

示例1

輸入

複制

9

輸出

4

說明

1→2→3→6→9

題解:水題,找規律,從大到小找,如果n為奇數 n=n/2+1 n為偶數 n=n/2 直到n=1結束,記錄次數就ok了。

AC代碼:

#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
typedef long long ll;
const int mmax=1e6+10;
int main()
{
 ll n,k;
 cin>>n;
 for(int i=1;i<1000;i++)
 {
	  if(n==1)
	  {
		   k=i-1;
		   break; 
	  }
	  if(n%2==0)
	  	 n/=2;
	  else
	  	 n=n/2+1;
 }
 cout<<k<<endl;
 return 0;
} 
           

D.Chino with Equation

題目描述

Chino的數學很差,是以Cocoa非常擔心。今天,Cocoa要教Chino解不定方程。

衆所周知,不定方程的解有0個或者若幹個。

給出方程: X1+X2+…+Xm=n(1<=m<=n<=1e6)

Cocoa想知道這個不定方程的正整數解和非負整數解各有幾個。

題目對Chino來說太難啦,你能幫一幫Chino嗎?

輸入描述:

兩個正整數m, n

輸出描述:

題目要求的答案,即正整數解的個數和非負整數解的個數 。由于答案可能會很大,你隻需要輸出答案 mod(109 + 7) 即可。

示例1

輸入

4 7

輸出

20 120

題解:組合數問題,搞明白就好做了

正整數解(都>0): m個位置,要求和=n, 他隻會有n-1個數組合(因為最小值是1,是以最大不可能是n),隻需要确定m-1個位置 剩餘的1個數自然就确定。是以正整數解為C(n-1,m-1)

非負整數解(都>=0): m個位置可能是0,此時這個位置為空,這樣就有n+m-1個數組合(1~n 加上 m-1個空位子) 隻需要确定m-1個位置 剩餘的1個數自然就确定。是以正整數解為C(n+m-1,m-1)

思路明白了看怎麼解決,資料要2e6 求組合數有技巧,首先打個從1到2e6的階乘,

利用逆元定理求出最後的解。(因為同餘定理沒有除法,的需要計算他的逆元,利用費馬小定理,aa ^ (p-2)=1(mod p) gcd(a,p)=1 ),主要計算a^(p-2)

組合數公式C(n,m)=n!/(m!(n-m)!)

AC代碼:

#include<iostream>
using namespace std;
typedef long long ll;
const int mmax=2000010;
const int mod=1e9+7;
ll mul[mmax];
void init()
{
	 mul[0]=1;
	 for(int i=1;i<=2000000;i++)
	 {
		  mul[i]=(mul[i-1]*i)%mod;
	 }
}
ll quick_mul(ll a,ll b)
{
	 ll temp=a%mod;
	 ll ans=1;
	 while(b)
	 {
		  if(b&1)
		  	 ans=(ans*temp)%mod;
		  temp=(temp*temp)%mod;
		  b>>=1;
	 }
 return ans%mod;
}
ll ni(ll a, ll b)
{
	 return quick_mul(a,b-2)%mod;
}
ll c(ll n,ll m)
{
	 return (mul[n]*ni(mul[n-m]*mul[m]%mod,mod))%mod;
}
int main()
{
	 init();
	 ll m,n;
	 cin>>m>>n;
	 cout<<c(n-1,m-1)<<" "<<c(n+m-1,m-1)<<endl;
 	return 0;
 } 
           

F.Chino with Expectation

題目描述

Chino的數學很差,是以Cocoa非常擔心。這一天,Cocoa準備教Chino學習數學期望。衆所周知,數學期望就是所有可能的結果乘以機率,那麼我們可以說的期望

定義非常簡單,Chino也一下就學會了。現在是作業時間啦!

Cocoa在紙上寫下個正整數,接下來Cocoa會進行次詢問,每次詢問形如“x,l,r ”,表示如果Cocoa把數列中的某個數加上x以後的期望。

題目對于Chino來說太難啦,你能幫一幫Chino嗎?

輸入描述:

第一行是兩個正整數n, q;接下來一行是n個數ai,接下來q行每行三個數xi, li, ri,描述了一組詢問

輸出描述:

對于每組詢問,給出相應的回答。你的答案會被認為是正确的,當且僅當你的答案是a,标準答案是b,并且|a−b|max(1,b)≤10−6|a−b|max(1,b)≤10−6

示例1

輸入

5 3

1 2 3 4 5

1 2 3

2 1 4

4 3 5

輸出

2.700000

2.900000

4.800000

題解:從l到r的和用字首和表示,難點是那個數加x 。

分兩種情況讨論(P表示L,R 的期望)

  1. x加到非 L , R 區間,(非區間/總長度 ) * L,R的期望
  2. x加到L , R 區間,(區間長度/總長度) * (L,R的期望 + x /區間長度)

    把兩個加起來就是答案

    AC代碼:

#include<iostream>
#include<cstdio>
using namespace std;
typedef long long ll;
const int mmax=1e6+10;
ll sum[mmax],a[mmax];
int main()
{
 ll n,p;
	 scanf("%lld %lld",&n,&p);
 for(int i=1;i<=n;i++)
	  scanf("%lld",&a[i]);
 for(int i=1;i<=n;i++)
	  sum[i]=sum[i-1]+a[i];
 for(int i=1;i<=p;i++)
 {
	  ll x,l,r;
	  scanf("%lld %lld %lld",&x,&l,&r);
	  double ans=0,p1,p2;
	  double ans0=(sum[r]-sum[l-1])/(double)(r-l+1);
	  p1=(double)(r-l+1)/n;
	  p2=(double)(n-(r-l+1))/n;
	  ans=p2*ans0+p1*(ans0+((double)x/(r-l+1)));
	  //cout<<p2<<" "<<p1<<" "<<ans0<<endl;
	  printf("%.6lf\n",ans);
 }
	 return 0;
 } 
           

繼續閱讀