919递归与递推
已结束
IOI
开始于: 2026-9-19 8:30
150
小时
主持人:
11
部分题解
//D题
#include<bits/stdc++.h>
using namespace std;
const int MOD = 100003;
const int MAXN = 1005;
int dp[MAXN][MAXN]; // 备忘录存储计算后得节点,初始化为 -1 表示未计算
bool block[MAXN][MAXN];
int N, M;
int dfs(int x, int y) {
// 1. 越界处理(防止走到棋盘外)
if (x < 1 || y < 1 || x > N || y > N) return 0;
// 2. 遇到障碍物
if (block[x][y]) return 0;
// 3. 到达起点
if (x == 1 && y == 1) return 1;
// 4. 备忘录:如果已经计算过,直接返回
if (dp[x][y] != -1) return dp[x][y];
// 5. 状态转移:递归计算上边和左边的路径数
dp[x][y] = (dfs(x - 1, y) + dfs(x, y - 1)) % MOD;
return dp[x][y];
}
int main() {
cin >> N >> M;
memset(block, 0, sizeof(block));
memset(dp, -1, sizeof(dp)); // 注意:记忆化搜索需要初始化为 -1
int a, b;
for (int i = 1; i <= M; i++) {
cin >> a >> b;
if (a >= 1 && a <= N && b >= 1 && b <= N) // 防止越界
block[a][b] = 1;
}
cout << dfs(N, N) << endl;
return 0;
}
157 绝对素数
#include <bits/stdc++.h>
using namespace std;
bool isPrime(int n)
{
if (n < 2) return false;
for (int i = 2; i * i <= n; i++)
{
if (n % i == 0)
return false;
}
return true;
}
int main()
{
for (int num = 10; num <= 99; num++)
{
int a = num / 10;
int b = num % 10;
int rev = b * 10 + a;
if (isPrime(num) && isPrime(rev))
{
cout << num << endl;
}
}
return 0;
}
大整数加法
#include <bits/stdc++.h>
using namespace std;
vector<int> toBig(string s)
{
vector<int> res;
for(int i = s.size() - 1; i >= 0; i--)
{
res.push_back(s[i] - '0');
}
return res;
}
vector<int> bigAdd(vector<int> a, vector<int> b)
{
vector<int> res;
int carry = 0;//进位
for(int i = 0; i < a.size() || i < b.size() || carry; i++) //直接根据长度处理
{
if(i < a.size()) carry += a[i];
if(i < b.size()) carry += b[i];
res.push_back(carry % 10);
carry /= 10;
}
return res;
}
int main()
{
string s1, s2;
cin >> s1 >> s2;
vector<int> A = toBig(s1);
vector<int> B = toBig(s2);
vector<int> ans = bigAdd(A, B);
for(int i = ans.size() - 1; i >= 0; i--)
{
cout << ans[i];
}
return 0;
}
- 状态
- 已结束
- 规则
- IOI
- 题目
- 8
- 开始于
- 2026-9-19 8:30
- 结束于
- 2026-9-25 14:30
- 持续时间
- 150 小时
- 主持人
- 参赛人数
- 11