为什么把Limit存进dp数组会wa
查看原帖
为什么把Limit存进dp数组会wa
299810
issue_is_fw楼主2020/11/18 20:13

只是把acac代码多记录一维limitlimit表示卡不卡上界

为什么就wa了呢......

以前做过的题都可以这样啊...这题有什么特殊之处吗?

#include <bits/stdc++.h>
using namespace std;
#define int long long
int l,r,f[20][222][222][2],a[22];
//到第i位,所需数位和是j,余数是q,模数是已知 
int dfs(int len,int limit,int he,int now,int sum)//he表示需要的数位和,now表示剩余的数位和 
{
	if( now<0 )	return (int)0;
	if( len==0 )	return ( sum==0 && now==0 );
	if( f[len][now][sum][limit]!=-1 )	return f[len][now][sum][limit];
	int last = limit?a[len]:9, ans = 0;
	for(int i=0;i<=last;i++)
		ans += dfs( len-1,limit&&(i==a[len] ),he,now-i,(sum*10+i)%he );
	return	f[len][now][sum][limit] = ans;
}
int solve(int x,int k)
{
	memset( a,0,sizeof(a) );
	while( x )
		a[++a[0]] = x%10, x/= 10;
	return dfs( a[0],1,k,k,0 );
}
signed main()
{
	cin >> l >> r;
	int ans = 0;
	for(int mo=1;mo<=200;mo++)
	{
		memset( f,-1,sizeof(f) );
		ans += solve( r,mo ) - solve( l-1,mo );
	}
	cout << ans;
} 

acac代码

#include <bits/stdc++.h>
using namespace std;
#define int long long
int l,r,f[20][222][222],a[22];
//到第i位,所需数位和是j,余数是q,模数是已知 
int dfs(int len,int limit,int he,int now,int sum)//he表示需要的数位和,now表示剩余的数位和 
{
	if( now<0 )	return (int)0;
	if( len==0 )	return ( sum==0 && now==0 );
	if( !limit && f[len][now][sum]!=-1 )	return f[len][now][sum];
	int last = limit?a[len]:9, ans = 0;
	for(int i=0;i<=last;i++)
		ans += dfs( len-1,limit&&(i==a[len] ),he,now-i,(sum*10+i)%he );
	if( !limit )	f[len][now][sum] = ans;
	return ans;
}
int solve(int x,int k)
{
	memset( a,0,sizeof(a) );
	while( x )
		a[++a[0]] = x%10, x/= 10;
	return dfs( a[0],1,k,k,0 );
}
signed main()
{
	cin >> l >> r;
	int ans = 0;
	for(int mo=1;mo<=200;mo++)
	{
		memset( f,-1,sizeof(f) );
		ans += solve( r,mo ) - solve( l-1,mo );
	}
	cout << ans;
} 
2020/11/18 20:13
加载中...