马蹄集OJ赛第十三次

目录

小码哥的抽卡之旅

抽奖概率

越狱

square

矩阵乘法

找朋友

赌石

甜甜花的研究

行列式

饿饿!饭饭!


小码哥的抽卡之旅


难度:黄金
①时间限制:1秒
巴占用内存:128M
小码哥最近迷上了一款抽卡游戏。单抽出金的概率是0.6%,如果前89发都不出金,则90发必出
金。小码哥目前存了一些抽数,想要你帮他算算他出金的概率。
格式
输入格式:一个整数,表示小码哥的抽数。
输出格式:一个百分数p,表示出金的概率,保留六位小数(按所给样例。

//
// 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。
输出格式:保留到小数后六位。

//
// 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。
输出格式:输出一行一个整数代表答案。

//
// 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。

//
// 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行,每行个元素,表示结果矩阵。

//
// 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
复制

//
// 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,且保证为偶数)。
输出格式:输出一个四位小数代表所求答案。

//
// 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取模。

//
// 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

//
// 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的意义详见
题面。
输出格式:输出一行一个数,表示满足小码哥需要的方案数。

//
// 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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值