一本通1588数字游戏

1588:数字游戏

时间限制: 1000 ms         内存限制: 524288 KB

题目描述

由于科协里最近真的很流行数字游戏,某人又命名了一种取模数,这种数字必须满足各位数字之和 modN 为 0。现在大家又要玩游戏了,指定一个整数闭区间 [a,b],问这个区间内有多少个取模数。

输入格式

题目有多组测试数据。每组只含三个数字 a,b,N。

输出格式

对于每个测试数据输出一行,表示各位数字和 modN 为 0 的数的个数。

样例

样例输入

1 19 9

样例输出

2

数据范围与提示

对于全部数据,1a,b2^311,1N<100。

sol:稍微变了变,但也很难,而且要记录一个arr,因为很多dp值仍然是0,直接写if(dp[i]~~[i])就起不到记搜的效果了

#include <bits/stdc++.h>
using namespace std;
int Mod;
int Num[20],dp[20][10][105][2][2];
bool arr[20][10][105][2][2];
inline int dfs(int Weis,int Shuz,int Yus,bool Shangj,bool Qiand0)
{
    if(arr[Weis][Shuz][Yus][Shangj][Qiand0]) return(dp[Weis][Shuz][Yus][Shangj][Qiand0]);
    arr[Weis][Shuz][Yus][Shangj][Qiand0]=1;
    if(Weis==1) return (dp[Weis][Shuz][Yus][Shangj][Qiand0]=(Shuz%Mod==Yus)?1:0);
    dp[Weis][Shuz][Yus][Shangj][Qiand0]=0;
    int i,Up=Shangj?Num[Weis-1]:9;
    for(i=0;i<=Up;i++)
    {
        bool Bo1=(Shangj&&i==Up),Bo2=(Qiand0&&i==0);
        dp[Weis][Shuz][Yus][Shangj][Qiand0]+=dfs(Weis-1,i,(Yus-Shuz%Mod+Mod)%Mod,Bo1,Bo2);
    }
    return dp[Weis][Shuz][Yus][Shangj][Qiand0];
}
inline int Solve(int n)
{
    if(n==0) return 1;
    *Num=0;
    while(n)
    {
        Num[++*Num]=n%10;
        n/=10;
    }
    int i,ans=0;
    ans+=dfs(*Num,0,0,0,1);
    for(i=1;i<Num[*Num];i++)
    {
        ans+=dfs(*Num,i,0,0,0);
    }
    ans+=dfs(*Num,Num[*Num],0,1,0);
    memset(arr,0,sizeof arr);
    return ans;
}
int main()
{
//    freopen("test1.in","r",stdin);
    int l,r;
    while(~scanf("%d%d%d",&l,&r,&Mod))
    {
        printf("%d\n",Solve(r)-Solve(l-1));
    }
    return 0;
}
/*
input
1 19 9
output
2

input
1 1893117615 79
output
62
*/
View Code

猜你喜欢

转载自www.cnblogs.com/gaojunonly1/p/10360122.html