题目:http://ac.jobdu.com/problem.php?pid=1491
题意:给一个数n,求小于等于n的数中的有多少个数字1和数字2。
思路:假设n为abcde。
求第c位出现多少个1: if c>1 : (ab+1)*100; if c=1 : (ab*100)+de+1; if c<1 ab*100
求2的时候同理。
#include <iostream>
#include <string.h>
#include <algorithm>
#include <cstdio>
using namespace std;
#define MOD 20123
int modnum[110];
char str[150];
void init(){
int i;
modnum[0] = 1;
for (i = 1; i <= 100; i++)
modnum[i] = modnum[i - 1] * 10 % MOD;
}
int exp_mod(int sta, int tail){
int s = 0;
for (; sta < tail; sta++)
s = (s * 10 + str[sta] - '0') % MOD;
return s;
}
int main(){
freopen("in.txt", "r", stdin);
int len, i, res, high, low, c;
init();
while (scanf("%s", str) != EOF){
len = strlen(str);
res = 0;
for (i = 0; i < len; i++){
high = exp_mod(0, i);
low = exp_mod(i + 1, len) + 1;
c = str[i] - '0';
res = (res + 2 * high*modnum[len-i-1]) % MOD;
if (c == 1){
res = (res + low) % MOD;
}
else if (c == 2){
res = (res + modnum[len-i-1] + low) % MOD;
}
else if (c > 2){
res = (res + 2 * modnum[len-i-1]) % MOD;
}
}
printf("%d\n", res);
}
return 0;
}