1. 程式人生 > >【LOJ10166】數字遊戲

【LOJ10166】數字遊戲

題目描述

由於科協裡最近真的很流行數字遊戲,某人又命名了一種取模數,這種數字必須滿足各位數字之和  mod N\bmod NmodN 為 000。現在大家又要玩遊戲了,指定一個整數閉區間 [a,b][a,b][a,b],問這個區間內有多少個取模數。

輸入格式

題目有多組測試資料。每組只含三個數字 a,b,Na, b, Na,b,N。

輸出格式

對於每個測試資料輸出一行,表示各位數字和  mod N\bmod NmodN 為 000 的數的個數。

樣例

樣例輸入

1 19 9

樣例輸出

2

資料範圍與提示

對於全部資料,

解析:        還是裸得不能再裸的數位DP。

程式碼:  

#include <bits/stdc++.h>
using namespace std;

const int Max=12;
int n,m,l,r,f[Max][110][2];
char ch[Max];

inline int dfs(int pos,int sum,int limit)
{
	if(pos==n+1) return !sum ? 1 : 0;
	if(~f[pos][sum][limit]) return f[pos][sum][limit];
	int mx=limit?ch[pos]-'0':9,ans=0;
	for(int i=0;i<=mx;i++) ans+=dfs(pos+1,(sum+i)%m,limit&(i==mx));
	return f[pos][sum][limit]=ans;
}

inline int solve(int num)
{
	memset(f,-1,sizeof(f));
	sprintf(ch+1,"%d",num),n=strlen(ch+1);
	return dfs(1,0,1);
}

int main()
{
	while(cin>>l>>r>>m) cout<<solve(r)-solve(l-1)<<"\n";
	return 0;
}