Loj10166 数字游戏2
Posted jason2003
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Loj10166 数字游戏2相关的知识,希望对你有一定的参考价值。
题目描述
由于科协里最近真的很流行数字游戏,某人又命名了一种取模数,这种数字必须满足各位数字之和 modN 为 000。现在大家又要玩游戏了,指定一个整数闭区间 [a,b][a,b][a,b],问这个区间内有多少个取模数。
枚举每一位,记录每一次枚举%n的余数,当枚举完时,如果余数是0,就+1,否则+0.
#include <iostream> #include <cstdio> #include <algorithm> #include <cstdlib> #include <cstring> #define in(a) a=read() #define REP(i,k,n) for(int i=k;i<=n;i++) using namespace std; inline int read(){ int x=0,f=1; char ch=getchar(); for(;!isdigit(ch);ch=getchar()) if(ch==‘-‘) f=-1; for(;isdigit(ch);ch=getchar()) x=x*10+ch-‘0‘; return x*f; } int a,b,n,digit[105],dp[105][300],ind; inline int dfs(int pos,int state,bool flag){ if(!pos) return state==0; if(!flag && dp[pos][state]!=-1) return dp[pos][state]; int up,ans=0; if(flag) up=digit[pos]; else up=9; REP(i,0,up) ans+=dfs(pos-1,(state+i)%n,flag && i==digit[pos]); if(!flag) dp[pos][state]=ans; return ans; } inline int solve(int x){ ind=0; while(x){ digit[++ind]=x%10; x/=10; } digit[ind+1]=-1; return dfs(ind,0,1); } int main(){ while(scanf("%d%d%d",&a,&b,&n)!=EOF){ memset(dp,-1,sizeof(dp)); printf("%d ",solve(b)-solve(a-1)); } }
以上是关于Loj10166 数字游戏2的主要内容,如果未能解决你的问题,请参考以下文章
loj10195. 「一本通 6.1 练习 2」转圈游戏 (loj2608)
LeetCode810. 黑板异或游戏/455. 分发饼干/剑指Offer 53 - I. 在排序数组中查找数字 I/53 - II. 0~n-1中缺失的数字/54. 二叉搜索树的第k大节点(代码片段