本人水平有限,题解不到为处,请多多谅解
本蒟蒻谢谢大家观看
传送门:彩蛋~
Problem F: 小雄数
Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 114 Solved: 56
[Submit][Status][Web Board]
Description
小雄的幸运数字是3,小雄想知道,1~n中有多少数含有3。因为答案有可能很大,输出答案mod p的值。
Input
第1行:两个整数n和p。
Output
只有一行,一个整数s,表示1~n中有s个数中含有数字3。
n≤10^100,p≤10^6。
n≤10^100,p≤10^6。
Sample Input
100 100
Sample Output
19
【样例说明】
1~100中共有19个数中含有数字3,分别是3,13,23,30,31,32,33,34,35,36,37,38,39,43,53,63,73,83,93。
HINT
大意与第一题的 lucky 相同
要注意数组开大一些,记录ans时也要取膜 如:ans=(ans*10+a[i]-'0')%mod
核心语句:ans=(ans-f[len-i+1][j]+mod)%mod; 取模运算 + - * / 保证不会有负数出现
#include<bits/stdc++.h> using namespace std; unsigned long long f[212][212],ans,len,b[100001]; int p; char a[1212]; int main() { scanf("%s",a+1); scanf("%d",&p); len=strlen(a+1); for(int i=1;i<=len;i++) { ans=(ans*10+(a[i]-'0'))%p; b[i]=a[i]-'0'; } f[0][0]=1; for(int i=1;i<=len;i++) { for(int j=0;j<=9;j++) { for(int k=0;k<=9;k++) { if(j!=3) { f[i][j]=(f[i][j]+f[i-1][k])%p; } } } } for(int i=1;i<=len;i++) { for(int j=0;j<b[i];j++) { ans=(ans-f[len-i+1][j]+p)%p; 一定要加上p,保证不会有负数出现 } if(b[i]==3) { ans++; break; } } printf("%d",ans); }