0
点赞
收藏
分享

微信扫一扫

B-number HDU - 3652

Separes 2022-06-15 阅读 30

​​http://acm.hdu.edu.cn/showproblem.php?pid=3652​​

log10(n)很小 枚举一下轴位置即可 力矩和作为状态

和poj 3252一样 不过需要多一维来记录模数

 

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=20;

int dp[maxn][maxn][3];
int bit[maxn],val[maxn];

void init()
{
int i;
memset(dp,-1,sizeof(dp));
val[0]=1;
for(i=1;i<=9;i++){
val[i]=10*val[i-1];
}
}

int dfs(int pos,int mod,int pre,int sta,int limit)
{
int res,up,i,tmp;
if(pos==-1) return (mod==0)&&(sta==2);
if(!limit&&dp[pos][mod][sta]!=-1) return dp[pos][mod][sta];
if(limit) up=bit[pos];
else up=9;
res=0;
for(i=0;i<=up;i++){
if(sta==2||(pre==1&&i==3)){
res+=dfs(pos-1,(mod+i*val[pos])%13,i,2,limit&&i==bit[pos]);
}
else{
res+=dfs(pos-1,(mod+i*val[pos])%13,i,i==1,limit&&i==bit[pos]);
}
}
if(!limit) dp[pos][mod][sta]=res;
return res;
}

int solve(int val)
{
int n;
n=0;
while(val>0){
bit[n++]=val%10;
val/=10;
}
return dfs(n-1,0,-1,0,1);
}

int main()
{
int val;
init();
while(scanf("%d",&val)!=EOF){
printf("%d\n",solve(val));
}
return 0;
}

 


举报

相关推荐

0 条评论