只是把ac代码多记录一维limit表示卡不卡上界
为什么就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;
}
ac代码
#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;
}