题解 P5635 【【CSGRound1】天下第一】

· · 题解

分析题目:

AC历程:

#include <bits/stdc++.h>
using namespace std;
int t,mod,x,y;
long long f[1001][1001];
// 此处f开[1001][1001],是RE;
// 开[10001][10001],很明显的MLE了
inline int solve(int x,int y,int tot) {
    if(tot>10000) return 3;

    if(f[x][y]!=0) return f[x][y];
    if(x==0) return f[x][y]=1;
    if(y==0) return f[x][y]=2;

    int xx=(x+y)%mod;
    int yy=(xx+y)%mod;
    return f[x][y]=solve(xx,yy,tot+1);

}

int main() {
    scanf("%d%d",&t,&mod);
    while(t--) {
        scanf("%d%d",&x,&y);
        if(solve(x,y,0)==1) puts("1");
        else if(solve(x,y,0)==2) puts("2");
        else puts("error");
    }
    return 0;
}

代码如下:

#include <bits/stdc++.h>
using namespace std;
int t,mod,x,y;
short f[10001][10001];

inline int solve(int x,int y,int tot) {
    if(tot>10000) return 3;

    if(f[x][y]!=0) return f[x][y];
    if(x==0) return f[x][y]=1;
    if(y==0) return f[x][y]=2;

    int xx=(x+y)%mod;
    int yy=(xx+y)%mod;
    return f[x][y]=solve(xx,yy,tot+1);

}

int main() {
    scanf("%d%d",&t,&mod);
    while(t--) {
        scanf("%d%d",&x,&y);
        if(solve(x,y,0)==1) puts("1");
        else if(solve(x,y,0)==2) puts("2");
        else puts("error");
    }
    return 0;
}

再下关于C++里的数据类型的基础知识叭(dalao请忽略qwq)

在32 位的系统上

short 占据的内存大小是2 个byte;
int占据的内存大小是4 个byte;
long占据的内存大小是4 个byte;
float占据的内存大小是4 个byte;
double占据的内存大小是8 个byte;
char占据的内存大小是1 个byte。

int 的范围为-2147483648~ 2147483647;
short的范围为 -32768~ 32767。

PS:当然,这道题的算法标签是骗人的。不用记忆化也能过,代码和记忆化的都差不多,f数组都不用开。

将solve改成如下即可:

inline int solve(int x,int y,int tot) {
    if(tot>10000) return 3;
    if(x==0) return 1;
    if(y==0) return 2;
    else {
        int xx=(x+y)%mod;
        int yy=(xx+y)%mod;
        solve(xx,yy,tot+1);
    }
}

这题很水,对不对QAQ