目录
小码哥的抽卡之旅
难度:黄金
①时间限制: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;
}