1.暴力0分
ybt
未通过
测试点 | 结果 | 内存 | 时间 |
测试点1 | 答案错误 | 612KB | 2MS |
LOJ
暴力0分代码如下:
#include <bits/stdc++.h>
using namespace std;
int num[12];
int main(){
int lt,rt,n,i,pos,j,sum,cnt=0,x;
scanf("%d%d%d",<,&rt,&n);
for(i=lt;i<=rt;i++){
x=i,pos=0;
while(x){
num[pos++]=x%10;
x/=10;
}
sum=0;
for(j=pos-1;j>=0;j--){
sum+=num[j];
}
if(sum%n==0)cnt++;
}
printf("%d\n",cnt);
return 0;
}
2.需要记录中间数据的数位DP
多次提交未果,才发现 题目有多组测试数据
该题特别之处在于,动归过程,须记录中间数据。
ybt
通过
测试点 | 结果 | 内存 | 时间 |
测试点1 | 答案正确 | 608KB | 1MS |
LOJ
需要记录中间数据的数位DP的AC代码如下:
#include <bits/stdc++.h>
using namespace std;
int dp[12][105],N,num[12];
int dfs(int pos,int sum,int limit){
int up,ans=0,i;
if(pos==-1)return sum==0;
if(!limit&&dp[pos][sum]!=-1)return dp[pos][sum];
up=limit?num[pos]:9;
for(i=0;i<=up;i++){
ans+=dfs(pos-1,(sum+i)%N,limit&&i==up);
}
if(!limit)dp[pos][sum]=ans;
return ans;
}
int solve(int x){
int pos=0;
while(x){
num[pos++]=x%10;
x/=10;
}
return dfs(pos-1,0,1);
}
int main(){
int lt,rt;
while(scanf("%d%d%d",<,&rt,&N)!=EOF){
memset(dp,-1,sizeof(dp));
printf("%d\n",solve(rt)-solve(lt-1));
}
return 0;
}