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