Pagini recente » Statistici strat sabina (sabinastrat) | Rating Guran Lupulescu Patrick (Patrick_) | Cod sursa (job #332643) | Cod sursa (job #254540) | Cod sursa (job #1508468)
#include <fstream>
#include <iostream>
#include <cstring>
#include <vector>
#include <array>
using namespace std;
constexpr int mod = 30103;
void do_firsts(const vector<char>& v, vector<array<unsigned char, 10>>& firsts, array<unsigned char, 10>& absolute_firsts){
const int n = v.size();
for(auto& x : firsts[n-1]){
x = n; }
for(int i = n-2; i >= 0; --i){
firsts[i] = firsts[i+1];
firsts[i][v[i+1]] = i+1; }
absolute_firsts = firsts[0];
absolute_firsts[v[0]] = 0; }
int main(){
ifstream f("diviz.in");
ofstream g("diviz.out");
int k, a, b;
f >> k >> a >> b >> ws;
vector<char> v(201, 0);
f.get(&v[0], 201, '\n');
const int n = strlen(&v[0]);
v.erase(begin(v) + n, end(v));
v.shrink_to_fit();
for(auto& x : v){
x -= '0'; }
vector<vector<vector<short>>> d(b+1, vector<vector<short>>(n, vector<short>(k, 0)));
vector<array<unsigned char, 10>> firsts(n, array<unsigned char, 10>({}));
array<unsigned char, 10> absolute_firsts;
do_firsts(v, firsts, absolute_firsts);
for(int i = 1; i < 10; ++i){
if(absolute_firsts[i] < n){
d[1][absolute_firsts[i]][i%k] = 1; } }
for(int len = 1; len < b; ++len){
for(int i = 0; i < n; ++i){
for(int cifra = 0; cifra < 10; ++cifra){
if(firsts[i][cifra] < n){
for(int rest_k = 0; rest_k < k; ++rest_k){
short& x = d[len+1][firsts[i][cifra]][(10*rest_k+cifra)%k];
x += d[len][i][rest_k];
if(x >= mod){
x -= mod; } } } } } }
int rez = 0;
for(int len = a; len <= b; ++len){
for(int i = 0; i < n; ++i){
rez += d[len][i][0];
if(rez >= mod){
rez -= mod; } } }
g << rez;
return 0; }