有 �N 级台阶,你一开始在底部,每次可以向上迈 1∼�1∼K 级台阶,问到达第 �N 级台阶有多少种不同方式。
两个正整数 �,�N,K。
一个正整数 ���(mod100003)ans(mod100003),为到达第 �N 级台阶的不同方式数。
输入 #1复制
5 2
输出 #1复制
8
思路:观察可以得到,当前的台阶数,可以在经过1——k阶的迈步得到,其次就是初始化
#include
#include
#include
using namespace std;
const int mod=100003;
int a[100005];
int main()
{
int n,k;
cin>>n>>k;
a[0]=1,a[1]=1;
for (int i=2;i<=n;++i)
{
for (int j=1;j<=k;++j)
{
if (i>=j)
{
a[i]=(a[i-j]+a[i])%mod;
}
}
}
cout<
把前 �2n2 个素数从左上角开始按右、下、左、上、右、下、左、上……的顺序填入 �×�n×n 的方阵就得到了蛇形素数方阵。以下是 �=4n=4 和 �=5n=5 的蛇形素数方阵:
给出 �n,你的任务是求出 �×�n×n 的蛇形素数方阵,并输出其中某个方格中的数值。
素数,又称质数,是指除 11 和其自身之外,没有其他约数的大于 11 的正整数。
输入一行三个正整数 �,�,�n,x,y。
输出一行一个整数,表示 �×�n×n 蛇形素数方阵第 �x 行第 �y 列中的数字。
输入 #1复制
5 1 4
输出 #1复制
7
输入 #2复制
5 4 3
输出 #2复制
79
参考上图 �=5n=5。
所有数据满足 1≤�,�≤�≤201≤x,y≤n≤20。
思路:运用素数筛法,把需要的素数都得到,其次就是蛇形矩阵的问题,这个问题做过,具体就是通过设置四个方向,遇到阻碍的时候就换个方向
int dir[4][2] = { {0, 1}, {1, 0}, {0, -1}, {-1, 0} };
int d = 0, x = 0, y = 0, idx = 2;
for (int i = 0; i < n * n; ++i) {
while (!isPrime[idx]) {
++idx;
}
b[x][y] = idx++;
int tx = x + dir[d][0], ty = y + dir[d][1];
if (tx < 0 || tx >= n || ty < 0 || ty >= n || b[tx][ty] != 0) {
d = (d + 1) % 4;
}
x += dir[d][0];
y += dir[d][1];
}
具体就是这样实现的,上面的idx主要是用来找素数的,xy表示位置信息
#include
#include
#include
#include
#include
#include//添加栈
#include
#include
#define pritnf printf
#define itn int
#define INF 10234567111
#define MAX 2000000
using namespace std;
#define str string
#define ll long long int
//字符串类型是string ceil()向上取整,C++的正常逻辑是向下取整
int main() {
int n, x1, y1;
cin >> n >> x1 >> y1;
vector isPrime(10000000, true);
isPrime[0] = isPrime[1] = false;
for (int i = 2; i <= 10000; ++i) {
if (isPrime[i]) {
for (int j = i * i; j <= 10000; j += i) {
isPrime[j] = false;
}
}
}
int b[21][21] = { 0 };
int dir[4][2] = { {0, 1}, {1, 0}, {0, -1}, {-1, 0} };
int d = 0, x = 0, y = 0, idx = 2;
for (int i = 0; i < n * n; ++i) {
while (!isPrime[idx]) {
++idx;
}
b[x][y] = idx++;
int tx = x + dir[d][0], ty = y + dir[d][1];
if (tx < 0 || tx >= n || ty < 0 || ty >= n || b[tx][ty] != 0) {
d = (d + 1) % 4;
}
x += dir[d][0];
y += dir[d][1];
}
cout << b[x1 - 1][y1 - 1] << endl;
return 0;
}
完整代码如上
战争已经进入到紧要时间。你是运输小队长,正在率领运输部队向前线运送物资。运输任务像做题一样的无聊。你希望找些刺激,于是命令你的士兵们到前方的一座独木桥上欣赏风景,而你留在桥下欣赏士兵们。士兵们十分愤怒,因为这座独木桥十分狭窄,只能容纳 11 个人通过。假如有 22 个人相向而行在桥上相遇,那么他们 22 个人将无法绕过对方,只能有 11 个人回头下桥,让另一个人先通过。但是,可以有多个人同时呆在同一个位置。
突然,你收到从指挥部发来的信息,敌军的轰炸机正朝着你所在的独木桥飞来!为了安全,你的部队必须撤下独木桥。独木桥的长度为 �L,士兵们只能呆在坐标为整数的地方。所有士兵的速度都为 11,但一个士兵某一时刻来到了坐标为 00 或 �+1L+1 的位置,他就离开了独木桥。
每个士兵都有一个初始面对的方向,他们会以匀速朝着这个方向行走,中途不会自己改变方向。但是,如果两个士兵面对面相遇,他们无法彼此通过对方,于是就分别转身,继续行走。转身不需要任何的时间。
由于先前的愤怒,你已不能控制你的士兵。甚至,你连每个士兵初始面对的方向都不知道。因此,你想要知道你的部队最少需要多少时间就可能全部撤离独木桥。另外,总部也在安排阻拦敌人的进攻,因此你还需要知道你的部队最多需要多少时间才能全部撤离独木桥。
第一行共一个整数 �L,表示独木桥的长度。桥上的坐标为 1,2,⋯ ,�1,2,⋯,L。
第二行共一个整数 �N,表示初始时留在桥上的士兵数目。
第三行共有 �N 个整数,分别表示每个士兵的初始坐标。
共一行,输出 22 个整数,分别表示部队撤离独木桥的最小时间和最大时间。22 个整数由一个空格符分开。
输入 #1复制
4 2 1 3
输出 #1复制
2 4
对于 100%100% 的数据,满足初始时,没有两个士兵同在一个坐标,1≤�≤5×1031≤L≤5×103,0≤�≤5×1030≤N≤5×103,且数据保证 �≤�N≤L。
思路:最短时间,就是所有人中,到达两端最短时间的最大值,通俗的说,就是:一个人可以选择到达两端,这样就产生了两个时间,这两个时间有长有短,我们需要那个短的时间,最后我们在找到这个最短时间的最大值就是最短的时间,而所需要撤退的最大时间也是同样的方法,可以轻松的知道,这个时候是由两个端点的人产生,所有只需要比较端点的人到达的时间与另一个人比较就可以了。
#include
using namespace std;
#define INF 10234567111
int main()
{
int l;
cin >> l;
int n;
cin >> n;
if (!n)
{
cout<<"0 0";
return 0;
}
int a[5005];
for (int i = 0; i < n; ++i) cin >> a[i];
int min_time,max_time;
sort(a, a + n);
for (int i=0;i
对于一个递归函数 �(�,�,�)w(a,b,c)
这是个简单的递归函数,但实现起来可能会有些问题。当 �,�,�a,b,c 均为 1515 时,调用的次数将非常的多。你要想个办法才行。
注意:例如 �(30,−1,0)w(30,−1,0) 又满足条件 11 又满足条件 22,请按照最上面的条件来算,答案为 11。
会有若干行。
并以 −1,−1,−1−1,−1,−1 结束。
输出若干行,每一行格式:
w(a, b, c) = ans
注意空格。
输入 #1复制
1 1 1 2 2 2 -1 -1 -1
输出 #1复制
w(1, 1, 1) = 2 w(2, 2, 2) = 4
保证输入的数在 [−9223372036854775808,9223372036854775807][−9223372036854775808,9223372036854775807] 之间,并且是整数。
保证不包括 −1,−1,−1−1,−1,−1 的输入行数 �T 满足 1≤�≤1051≤T≤105。
思路:这道题由于递归的原因,时间效率比较低,所有用记忆化搜索找,然后按照题目所给的信息走一遍就AC了。
#include
using namespace std;
long long dp[25][25][25];
long long w(long long a,long long b,long long c)
{
if (a<=0 || b<=0 || c<=0 ) return 1;
if (a>20 || b>20 || c>20 ) return w(20,20,20);
if (dp[a][b][c]!=0) return dp[a][b][c];
if (a
一只蜜蜂在下图所示的数字蜂房上爬动,已知它只能从标号小的蜂房爬到标号大的相邻蜂房,现在问你:蜜蜂从蜂房 �m 开始爬到蜂房 �n,�<�m 输入 �,�m,n 的值 爬行有多少种路线 输入 #1复制 输出 #1复制 对于100%的数据,1≤�,�≤10001≤M,N≤1000 思路:一道高精度,与之前刷的数楼梯相似https://www.luogu.com.cn/problem/P1255 当前的蜂房数字,由前两次得到(类似于斐波那契数列),区别就在于把递推的过程由高精度的方式实现,这个方法还是比较好,可以学习,定义的二维数组,前一个是当前的蜂房,后一个是当前蜂房的位数输入格式
输出格式
输入输出样例
1 14
377
说明/提示
#include