有个奇怪的问题
  • 板块P1831 杠杆数
  • 楼主Arteg
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/3/24 19:02
  • 上次更新2024/3/24 20:53:21
查看原帖
有个奇怪的问题
1015770
Arteg楼主2024/3/24 19:02

为什么solve函数最后

return ans-len;  

改成

return ans-len+1;

就错了 求dalao解答

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define ld long double

const int maxn=100010;
const int mo=1000000007;
const int inf=0x7f7f7f7f7f7f7f7f;

int read(){
	int x=0,f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-')
			f=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9'){
		x=x*10+ch-'0';
		ch=getchar();
	}
	return x*f;
}

int l,r,num[20],dp[19][19][20000];

int dfs(int len,int pos,int c,int lim){
	if(!lim&&dp[len][pos][c]!=-1)
		return dp[len][pos][c];
	if(len==0)
		return dp[len][pos][c]=(c==0);
	if(c<0)
		return 0;
	int tmp=0;
	int maxx=lim?num[len]:9;
	for(int i=0;i<=maxx;i++)
		tmp+=dfs(len-1,pos,c+i*(len-pos),lim&&(i==maxx));
	if(!lim)
		dp[len][pos][c]=tmp;
	return tmp;	
}

int solve(int x){
	if(x<10)
		return x;
	int ans=0,len=0;
	while(x){
		num[++len]=x%10;
		x/=10;
	}
	memset(dp,-1,sizeof(dp));	
	for(int pos=1;pos<=len;pos++)
		ans+=dfs(len,pos,0,1);	
	return ans-len;
}

signed main(){
	l=read();
	r=read();
	printf("%lld\n",solve(r)-solve(l-1));
	return 0;
}
2024/3/24 19:02
加载中...