马蹄集OJ赛第十三次

目录

小码哥的抽卡之旅

抽奖概率

越狱

square

矩阵乘法

找朋友

赌石

甜甜花的研究

行列式

饿饿!饭饭!


小码哥的抽卡之旅

难度:黄金

①时间限制:1秒

巴占用内存:128M

小码哥最近迷上了一款抽卡游戏。单抽出金的概率是0.6%,如果前89发都不出金,则90发必出

金。小码哥目前存了一些抽数,想要你帮他算算他出金的概率。

格式

输入格式:一个整数,表示小码哥的抽数。

输出格式:一个百分数p,表示出金的概率,保留六位小数(按所给样例。

cpp 复制代码
//
// Created by abner on 2023/10/25.
//
#include <bits/stdc++.h>
using namespace std;
int n;
double x[97],ans;
int main(){
    cin >>n;
    x[1]=1;
    for (int i = 2;i<=n;i++)
    x[i]=x[i-1]*0.994;
    for (int i=1;i<=n;i++)
        ans+=x[i]*0.006;
    ans*=100;
    if(n==90)
        ans=100;
    printf("%.6f\%\n",ans);
    return 0;
}

抽奖概率

难度:黄金

○时间限制:1秒

四占用内存:128M

小码哥正在进行抽奖,箱子里有一红一白两小球,每次摸出一个球,摸到红球中奖,如果中奖,

就不再继续抽奖;如果未中奖(摸到白球),则往箱子里补充一个白球(摸出的白球不放回),继

续抽奖,直到中奖,或者达到最大抽奖次数。

假设至多能抽奖M次,求当停止抽奖时,(中奖球数/摸出总球数)的期望。

格式

输入格式:一行,一个整数M。

输出格式:保留到小数后六位。

cpp 复制代码
//
// Created by abner on 2023/10/25.
//
#include <bits/stdc++.h>
using namespace std;
int n;
double p,ans;
int main(){
    cin >>n;
    p=1;
    for (int i=1;i <= n;++i){
        p /=2;
    ans += p / i;
}
printf("%.6lf\n",ans);
return 0;
}

越狱

难度:钻石

①时间限制:1秒

巴占用内存:128M

监狱有个房间,每个房间关押一个犯人,有m种宗教,每个犯人会信仰其中一种。如果相邻房

间的犯人的宗教相同,就可能发生越狱,求有多少种状态可能发生越狱。

答案对1007取模。

格式

输入格式:输入只有一行两个整数,分别代表宗教数m和房间数n。

输出格式:输出一行一个整数代表答案。

cpp 复制代码
//
// Created by abner on 2023/10/25.
//
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int mod = 1007;
int m,n,ans; 
long long binpow(long long a,long long b,long long m){
    a%=m;
    long long res = 1;
    while (b > 0){
    if (b & 1)
    res=res * a % m;
    a=a*a%m;
    b>>=1;
}
    return res;
}
            
    signed main() {

        cin >> m >> n;
        ans = binpow(m, n, mod) - m * binpow(m - 1, n - 1, mod) % mod;
        ans = (ans % mod + mod) % mod;
        cout << ans << endl;
        return 0;
    }

square

难度:钻石©

时间限制:3秒

巴占用内存:128M

在一个×的矩阵上,小码哥在左下角的顶点出现了,他只能沿着路径向上或者向右走,他的目标

是"蠕动"到右上角的顶点,问他有多少路径可以选择。嗯,这个、这个、这个似乎地球人都知道怎

么做,但是请注意,我有个条件没给呢!m和现在的最大范围是500阳,这可怎么办?仔细想

想吧。

格式

输入格式:只有一行,包含两个整数m和n,其均不小于4,上限均为50000。

输出格式:由于最后的答案数目过大,所以只检查后100位,输出时每行十个数字,没空格

间隔,共十行,如果答案位数没超过100位,则需要在空位上补0。

cpp 复制代码
//
// Created by abner on 2023/10/25.
//
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 7;//n+m
const int N2 = 107;
int n,m;
int fac[N],a[N2] = {1},c[N2];
void clear(int a[]) {//字符串清0
    for (int i = 0; i < N2; i++)
        a[i] = 0;
}
    void mul_short(int a[],int b,int c[]) {//a*b=c,高精度*单精度
        clear(c);
        for (int i = 0; i < N2; i++) {
            c[i] += a[i] * b;
            if (c[i] >= 10) {
                c[i + 1] += c[i] / 10;
                c[i] %= 10;
            }
        }
    }
                int main(){
                    cin >>m >>n;
                    n =n + m;
                    for (int i=n-m+1;i<=n;i++){
                        int tmp =i;
                        for (int j=2;j*j<=tmp;j++)
                            while (tmp % j==0) {
                                fac[j]++;
                                tmp /= j;
                            }
                                if (tmp > 1)
                                fac [tmp]++;
                            }
                        for (int i=1;i<=m;i++) {
                            int tmp = i;
                            for (int j = 2; j * j <= tmp; j++)
                                while (tmp % j == 0) {
                                    fac[j]--;
                                    tmp /= j;
                                }
                                    if (tmp > 1)
                                        fac[tmp]--;
                                }
                            for (int i = 2; i < N; i++)
                                while (fac[i]--) {
                                    mul_short(a, i, c);
                                    memcpy(a, c, sizeof(c));
                                }

                            for (int i = 99; i >= 0;i--)
                            if (i % 10 == 0)
                                cout << a[i] << endl;
                            else
                                cout << a[i];
                            return 0;
                        }

矩阵乘法

难度:黄金

0时间限制:5秒

巴占用内存:128M

输入两个矩阵,第一个矩阵尺寸为l*m,第二个矩阵尺寸为m*n,请你输出将这两个矩阵相

乘后的结果矩阵。

格式

输入格式:第一行输入三个整数l,m和n;

接下来行,每行m个元素,表示第一个矩阵;

再接下来m行,每行n个元素,表示第二个矩阵。

输出格式:输出l行,每行个元素,表示结果矩阵。

cpp 复制代码
//
// Created by abner on 2023/10/25.
//
#include <bits/stdc++.h>
using namespace std;
int l,m,n,a[1010][1010],b[1010][1010];
int main() {
    cin >> l >> m >> n;
    for (int i = 1; i <= l; i++) {
        for (int j = 1; j <= m; j++) {
            cin >> a[i][j];
        }
    }
    for (int i = 1; i <= m; i++) {
        for (int j = 1; j <= n; j++) {
            cin >> b[i][j];
        }
    }

    for (int i = 1; i <= l; i++) {
        for (int j = 1; j <= n; j++) {
            int x = 0;
            for (int k = 1; k <= m; k++) {
                x += a[i][k] * b[k][j];
            }
            cout << x << " ";
        }
        cout << endl;
    }
    return 0;
}

找朋友

难度:黄金

0时间限制:5秒

巴占用内存:128M

将个人分成组,每组至少一人,在比赛结束时,同一组的人两两之间都会成为朋友,不同分

组的分组方案得到的朋友对数不同。你的任务是求出最小和最大的朋友对数。

格式

输入格式:两个整数n、m。

输出格式:两个整数表示答案。

样例1

输入:51

复制

输出:1010

复制

cpp 复制代码
//
// Created by abner on 2023/10/25.
//
#include <bits/stdc++.h>
using namespace std;
#define int long long
int n,m,maxn,minn,tmp,tmp2;
signed main(){
    cin >>n >>m;
    tmp =n-(m-1);
    maxn = tmp * (tmp-1)/2;
    tmp = n / m,tmp2 =n % m;
    minn = (tmp* (tmp- 1))/2 *(m- tmp2)+(tmp* (tmp+ 1))/2* tmp2;
    cout <<minn <<" "<<maxn <<endl;
    return 0;
}

赌石

难度:黄金

①时间限制:1秒

巴占用内存:128M

富饶的璃月街道上有一家石料店,店主小码哥是个精明的商人,为了使他的赌石生意更加红火,他

根据赌徒的心理设计了一个有趣的买卖规则:他在店铺的两边放了个小桶,一个桶里有个红

球,另一个有m个蓝球。每一批2个璞石与这些球一一对应,对每个来买璞石的客户,小码哥都

会让他们在原地闭眼旋转数圈后走向一个小桶,若拿到蓝球则可免费获得一块石头,但若拿到红球

则需要付出两倍的价钱。

假设每个人每次拿到蓝球和红球的概率相同,现在请你求出一个桶里没球而另一个桶里还剩两个球

的概率,精确到小数点后四位。

格式

输入格式:输入一个正整数代表这批璞石的个数(不大于2500,且保证为偶数)。

输出格式:输出一个四位小数代表所求答案。

cpp 复制代码
//
// Created by abner on 2023/10/25.
//
#include <bits/stdc++.h>
using namespace std;
int n;
double ans;
int main(){
cin >>n;
n/=2;
ans=1.0;
for (int i=1;i<n;i++)
ans *= (double)(n -1+i)/(i*4);
printf("%.4lf\n",1- ans);
return 0;
}

甜甜花的研究

难度:黄金○时间限制:1秒

巴占用内存:128M

小码哥酷爱研究植物,他对甜甜花的研究无人能及,可他仍然在不断研究着。现在小码哥有粒

甜甜花的种子,每一粒种子都能长出不同的甜甜花,由于种子实在太多,小码哥一个人实在无法照

料,于是他雇佣了m位种植能手,第2个人能照料α,株甜甜花,请问小码哥有多少种分配方式

将这些种子分配出去?

格式

输入格式:输入共两行,第一行输入用空格隔开的两个正整数n,m;

第二行输入m个正整数,分别代表a,。

输出格式:输出一个整数表示方法个数:

由于结果可能很大,须将结果对12520取模。

cpp 复制代码
//
// Created by abner on 2023/10/25.
//
#include <bits/stdc++.h>
using namespace std;
long long n,m,num,ans = 1;
long long a[10007][107];
int main(){
cin >>n >>m;
a[0][0]=1;
for(int i=1;i<=10000;i++)
for (int j=0;j<=100;j++)
a[i][j]=(a[i-1][j-1]+a[i-1][j])%12520;
for (int i=1;i<=m;i++) {
    cin >> num;
    ans = ans * a[n][num] % 12520;
    n -= num;
}
cout <<ans;
return 0;
}

行列式

难度:黄金

①时间限制:1秒

巴占用内存:128M

给出矩阵,求其行列式。

格式

输入格式:第一行输入T表示数据组数;

对于每组数据,第一行输入n表示边长。接下来n行,每行输入n个整数,代

表矩阵的元素。

输出格式:对于每组数据,输出矩阵的行列式,答案请对0x1f1f1f1f取模。

样例1

输入:3

复制

3

cpp 复制代码
//
// Created by abner on 2023/10/25.
//
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int mod = 0x1f1f1f1f;

int T,n,a[10][10];
int sol(){

    int res =1,w=1;
    for (int i=1;i<=n;i++)
        for (int j=i+1;j <=n;++j) {
            while (a[i][i]) {
                int di = a[j][i] / a[i][i];
                for (int k = i; k <= n; ++k) {
                    a[j][k] = (a[j][k] - di * a[i][k] % mod + mod) % mod;
                }
                swap(a[i], a[j]);
                w = -w;
            }
            swap(a[i], a[j]);
            w = -w;
        }
for (int i=1;i<=n;i++)
res = a[i][i]*res% mod;
res = w *res;
            return (res+ mod)%mod;
        }
    signed main(){
        cin >>T;
        while (T--){
            cin >>n;
            for (int i=1;i <= n;++i)
                for (int j=1;j <= n;++j)
                    cin >>a[i][j];
            cout <<sol()<<endl;
        }
        return 0;
    }

饿饿!饭饭!

难度:黄金

0时间限制:1秒

巴占用内存:128M

嗯哼,小码哥在新的一年里不会忘记身为干饭人的初心!众所周知,小码哥非常不喜欢一直吃同样

的东西,但由于理想与现实的差距,食堂在这天里只会供应k种餐食。

在一天吃3餐的情况下,前w天一共w×3顿饭小码哥不希望有任何一顿重复。现在请问食堂有

多少种方案可以满足超级可爱乖巧的小码哥的需要。

格式

输入格式:一行,三个整数n,k,w表示n天内食堂只会供应k种餐食,w的意义详见

题面。

输出格式:输出一行一个数,表示满足小码哥需要的方案数。

cpp 复制代码
//
// Created by abner on 2023/10/25.
//
#include <bits/stdc++.h>
using namespace std;
int main(){
    int n,k,w,ans = 1;
    cin >>n >>k >>w;
    if(k<3*w) {
        cout << 0;
    }else{
    for (int i=0;i<=3 *w-1;i++)
        ans*= k-i;
    cout <<ans;
}
return 0;
}
相关推荐
Phoebe鑫13 分钟前
数据结构每日一题day11(链表)★★★★★
数据结构·算法
独好紫罗兰29 分钟前
洛谷题单3-P2669 [NOIP 2015 普及组] 金币-python-流程图重构
开发语言·python·算法
跳跳糖炒酸奶33 分钟前
第四章、Isaacsim在GUI中构建机器人(3):添加摄像头和传感器
人工智能·python·算法·ubuntu·机器人
Jay_See36 分钟前
Leetcode——239. 滑动窗口最大值
java·数据结构·算法·leetcode
肠胃炎1 小时前
真题246—矩阵计数
java·线性代数·算法·矩阵·深度优先
什码情况1 小时前
微服务集成测试 -华为OD机试真题(A卷、JavaScript)
javascript·数据结构·算法·华为od·机试
洋次郎的歌2 小时前
我要成为数据结构与算法高手(三)之双向循环链表
数据结构
罗西的思考3 小时前
[2W字长文] 探秘Transformer系列之(23)--- 长度外推
人工智能·算法
算AI21 小时前
人工智能+牙科:临床应用中的几个问题
人工智能·算法
我不会编程5551 天前
Python Cookbook-5.1 对字典排序
开发语言·数据结构·python