目录
前言
又是一次模拟赛,还是马拉松形式的…不出意料地又考炸了QAQ,肿么办(逃不掉
仅以此篇反思找找自己的不足,顺便祭奠我的爆零 😭
Problem
T1-打怪兽
题目描述
F a r m e r J o h n Farmer John FarmerJohn 在他的农场发现了一只可以分裂的小怪兽,他决定让 B e s s i e Bessie Bessie 来消灭它。
B e s s i e Bessie Bessie 每个单位时间做出一次攻击,一个只能攻击一只小怪兽,攻击效果与小怪兽的血量有关。
-
如果被攻击的小怪兽的血量为1,那么这只小怪兽就被消灭掉;
-
如果被攻击的小怪兽的血量不为1,这只怪兽会分裂成2只怪兽,新出现的怪兽的血量为 ⌊ x 2 ⌋ \lfloor \frac{x}{2} \rfloor ⌊2x⌋。 ⌊ ⌋ \lfloor \rfloor ⌊⌋符号的意思是 x x x 除 2 2 2 后向下取整。
现在 B e s s i e Bessie Bessie 想知道,自己最少攻击多少次,可以把怪兽消灭。
输入格式
一个整数,表示 H H H
输出格式
一个整数,表示最少攻击次数
数据规模
100% 数据 1 ≤ N ≤ 1 0 12 1≤N≤10^{12} 1≤N≤1012
时间限制:1s
空间限制:256MB
解题思路
- 良心的入门题,貌似没有难度,但本蒟蒻还是掉坑了,明明一个循环搞定的事偏要用二进制分解+快速幂(QAQ:其实是for循环没开long long)
Code
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
LL Mul(LL x,LL y) {
return 1LL*x*y; }
LL power(LL x,LL y)
{
LL ans=1;
for (;y;y>>=1,x=Mul(x,x))
if (y&1) ans=Mul(ans,x);
return ans;
}
int main()
{
freopen("monster.in","r",stdin);
freopen("monster.out","w",stdout);
LL h,x=0;
scanf("%lld",&h);
while (h>1)
{
h>>=1;
x++;
}
printf("%lld",power(2,x+1)-1);
return 0;
}
T2-奶牛排队
题目描述
Farmer John现在有 N 头奶牛,其中 K 头有斑点的,剩下的没有斑点。
现在Farmer John想让这些奶牛排队,现在他想知道,这 K 头奶牛在整个队列里,分成 1 , 2 , 3 … K 1,2,3…K 1,2,3…K 段的方案数为多少。
这里的一段是有斑点的奶牛挨着站一起。具体样例有解释
输入格式
两个整数 N N N 和 K K K
输出格式
K K K 行,每行一个整数,第 i i i 行表示有斑点的奶牛分成 i i i 段的方案数。 答案可能很大,你只需要输出答案对 1 0 9 + 7 10^9+7 109+7 取余即可。
数据规模
40% 保证 1 ≤ K ≤ N ≤ 100 1≤K≤N≤100 1≤K≤N≤100
100% 保证 1 ≤ K ≤ N ≤ 2000 1≤K≤N≤2000 1≤K≤N≤2000
时间限制:2s
空间限制:256MB
解题思路
- 乍一看是道组合题,果不其然,兴致勃勃地打了一个,谁知道最后只有56分(
竟然有56分!!!) - 得把这道题分步做,首先看做是 k 头有斑点的牛分为 x 组,根据隔板法可知,答案是 C k − 1 x − 1 \mathrm C_{k-1}^{x-1} Ck−1x−1;
- 然后把 x x x 组的牛插入 n − k + 1 n-k+1 n−