2018 藍橋杯省賽 B 組模擬賽(五)題目及解析

A. 結果填空:矩陣求和

給你一個從 n×n 的矩陣,裏面填充 1 到 n×n 。例如當 n 等於 3 的時候,填充的矩陣以下。ios

1 2 3
4 5 6
7 8 9

如今咱們把矩陣中的每條邊的中點連起來,這樣造成了一個新的矩形,請你計算一下這個新的矩形的覆蓋的數字的和。好比,n = 3 的時候矩形覆蓋的數字以下。算法

2
4 5 6
  8

那麼當 n 等於 101 的時候,矩陣和是多少?數組

題目解析:
這題畫一個7×7的矩陣觀察起來會比較直觀。矩形邊中點的連線包括邊上的 元素和全部處於邊界點之間的元素。在找準行列關係以後就很簡單了。spa

填空答案以下:code

#include <iostream>
using namespace std;
int main() {
//    cout << "/*請在這裏填入答案*/" << endl;
    cout << "26020201" << endl;
    return 0;
}

題解代碼以下:ci

#include <iostream>
#include <cmath>
using namespace std;
int a[1000][1000];
int main(){
    int n;
    cin>>n;
    //n=101;
    int p=1;
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            a[i][j]=p++;
        }
    }
    int m=n/2;
    int sum=0;
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            if(i<=m && j>=m-i && j<=m+i){
                sum+=a[i][j];
            }else if(i>m && j>=m-(n-i-1) && j<=m+(n-i-1)){
                sum+=a[i][j];
            }
        }
    }
    cout<<sum;
    return 0;
}

B. 結果填空:素數個數

用 0,1,2,3⋯7 這 8 個數組成的全部整數中,質數有多少個(每一個數字必須用到且只能用一次)。it

提示:以 0 開始的數字是非法數字。io

題目解析:
這題考察全排列,注意第一個數字不能是0。stream

填空答案以下:二進制

#include <iostream>
using namespace std;
int main() {
//    cout << "/*請在這裏填入答案*/" << endl;
    cout << "2668" << endl;
    return 0;
}

題解代碼以下:

#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
int isPrime(int n){
    for(int i=2;i<=sqrt(n);i++){
        if(n%i==0) return 0;
    }
    return 1;
}
int main(){
    int cnt=0;
    int a[8]={0,1,2,3,4,5,6,7};
    do{
        if(a[0]==0) continue;
        int sum=0;
        for(int i=0;i<8;i++){
            sum=sum*10+a[i];
        }
        if(isPrime(sum)) cnt++;
    }while(next_permutation(a,a+8));
    cout<<cnt;
    return 0;
}

D. 代碼填空:快速冪

一個數的整數次冪,是咱們在計算中常常用到的,可是怎麼能夠在 O(log(n)) 的時間內算出結果呢?

代碼框中的代碼是一種實現,請分析並填寫缺失的代碼,求 x^y mod p的結果。

題目解析:
這題主要考察y & 1。&是位與操做符,運算法則是在二進制數下,相同位的兩個數字都爲1,則爲1;如有一個不爲1,則爲0。
y & 1作位與操做,y&1是y和1作「按位與」運算,1的二進制只有末位是1,因此y & 1就是隻保留y的末位(二進制)。y & 1就表示了y的奇偶性。y & 1 == 1爲奇數,反之爲偶數。

填空答案以下:

#include <iostream>
using namespace std;

int pw(int x, int y, int p) {
    if (!y) {
        return 1;
    }
//    int res = /*在這裏填寫必要的代碼*/;
    int res = pw(x,y-1,p)+pw(x,y-1,p)*!(y&1);
    if (y & 1) { //判斷奇偶數,y&1==1爲奇數,反之爲偶數
        res = res * x % p;
    }
    return res;
}

int main() {
    int x, y, p;
    cin >> x >> y >> p;
    cout << pw(x, y, p) << endl;
    return 0;
}

E. 代碼填空:末尾零的個數

N! 末尾有多少個 0 呢?

N! = 1 x 2 x ··· x N。

代碼框中的代碼是一種實現,請分析並填寫缺失的代碼。

填空答案以下:

#include <iostream>
using namespace std;
int main() {
    int n, ans = 0;
    cin >> n;
    while (n) {
      //ans += /*在這裏填寫必要的代碼*/;
        ans += n/=5;
    }
    cout << ans << endl;
    return 0;
}
相關文章
相關標籤/搜索