不记忆化我超时,记忆化了以后WA了看不出记忆化哪里错了求调

题目:

我没有记忆化的 TLE70 代码:

#include<math.h>
#include<iostream>
#define I using
#define AK namespace
#define IOI std
#define i_ak return
#define ioi  0
I AK IOI;
typedef long long ll;
ll n,m,ans,L,R;
void dfs(ll x,ll step){
	if(step==10)return;
	ll i=n/x+1;
	if(i>=L&&i<=R)ans=max(ans,n%i);
	if(i!=0)dfs(n/i+1,step+1);
	if(i>1)dfs(n/(i-1)+1,step+1);
}
int main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    cin>>n>>m;
    ll maxn=n/2+1,mmod=n%maxn;
    while(m--){
        cin>>L>>R;
        if(L<=maxn&&maxn<=R)cout<<mmod<<endl;
		else if(L>maxn)cout<<n-L<<endl;
        else{
            ans=max(n%L,n%R);
            ll i1=n/L+1;
            if(i1>=L&&i1<=R)ans=max(ans,n%i1);
            ll i2=n/R+1;
            if(i2>=L&&i2<=R)ans=max(ans,n%i2);
            ll kl=n/L;
            if(kl!=0)dfs(kl,0);
			ll kr=n/R;
			if(kr!=0)dfs(kr,0);
            cout<<ans<<endl;
        }
    }
    return 0;
}

这是我改成记忆化以后的 WA30 的代码:

#include<math.h>
#include<iostream>
#include<unordered_map>
#define I using
#define AK namespace
#define IOI std
#define i_ak return
#define ioi  0
I AK IOI;
typedef long long ll;
ll n,m,ans,L,R;
unordered_map<ll,ll>mem;
ll dfs(ll x,ll step){
	if(mem.count(x))return mem[x];
	if(step==10)return ans;
	ll i=n/x+1;
	if(i>=L&&i<=R)ans=max(ans,n%i);
	if(i!=0)ans=max(ans,dfs(n/i+1,step+1));
	if(i>1)ans=max(ans,dfs(n/(i-1)+1,step+1));
	return mem[x]=ans;
}
int main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    cin>>n>>m;
    ll maxn=n/2+1,mmod=n%maxn;
    while(m--){
        cin>>L>>R;
        if(L<=maxn&&maxn<=R)cout<<mmod<<endl;
		else if(L>maxn)cout<<n-L<<endl;
        else{
        	mem.clear();
            ans=max(n%L,n%R);
            ll l1=0,l2=0;
            ll i1=n/L+1;
            if(i1>=L&&i1<=R)ans=max(ans,n%i1);
            ll i2=n/R+1;
            if(i2>=L&&i2<=R)ans=max(ans,n%i2);
            ll kl=n/L;
            if(kl!=0)ans=max(ans,dfs(kl,0));
			ll kr=n/R;
			if(kr!=0)ans=max(ans,dfs(kr,0));
            cout<<ans<<endl;
        }
    }
    return 0;
}

实在找不出哪里有问题了 qwq

题目名字叫啥

@徐千城俊 e叫做: Modulus

(脑子开始思索记忆花式干啥的

@徐千城俊 e又发现我哪里错了吗?

是不是优先级反了

我刚发现问题,结果 @稻叶昙 26分钟前就说了

爆搜写多后的直觉罢了(

@稻叶昙 @徐千城俊 谢谢我试试

e还是WA30

#include<math.h>
#include<iostream>
#include<unordered_map>
#define I using
#define AK namespace
#define IOI std
#define i_ak return
#define ioi  0
I AK IOI;
typedef long long ll;
ll n,m,ans,L,R;
unordered_map<ll,ll>mem;
ll dfs(ll x,ll step){
	if(step==10)return ans;
    if(mem.count(x))return mem[x];
	ll i=n/x+1;
	if(i>=L&&i<=R)ans=max(ans,n%i);
	if(i!=0)ans=max(ans,dfs(n/i+1,step+1));
	if(i>1)ans=max(ans,dfs(n/(i-1)+1,step+1));
	return mem[x]=ans;
}
int main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    cin>>n>>m;
    ll maxn=n/2+1,mmod=n%maxn;
    while(m--){
        cin>>L>>R;
        if(L<=maxn&&maxn<=R)cout<<mmod<<endl;
		else if(L>maxn)cout<<n-L<<endl;
        else{
        	mem.clear();
            ans=max(n%L,n%R);
            ll l1=0,l2=0;
            ll i1=n/L+1;
            if(i1>=L&&i1<=R)ans=max(ans,n%i1);
            ll i2=n/R+1;
            if(i2>=L&&i2<=R)ans=max(ans,n%i2);
            ll kl=n/L;
            if(kl!=0)ans=max(ans,dfs(kl,0));
			ll kr=n/R;
			if(kr!=0)ans=max(ans,dfs(kr,0));
            cout<<ans<<endl;
        }
    }
    return 0;
}

我先睡觉了,明天再调

我也先睡了(实则刷视频

我觉得用线段树写简单点

Deepseek助我

@徐千城俊 @稻叶昙 我回来了。继续跳题目(正解就是线段树但是我懒得写了 qwq

。。。线段树是什么

@徐千城俊 @稻叶昙 还在吗?我还是WA30

如果我没记错的话应该是有题解的

@huangfeidong e题解没有将我的方法,你知道我记忆化哪里写错了吗?

看不出来啊, @王钰宸涵

感觉没问题

奇怪了 我来随机@巨佬了 @稻叶昙 @栗子酱 @桑铃茜 @黎俊博1 @黎俊博 @2345安全卫士 @张乐凡 @郭子路