#include<iostream>#include<algorithm>#include<vector>usingnamespace std;constint N =10;intget(vector<int> num,int l,int r){int res =0;for(int i = l; i >= r; i --) res = res *10+ num[i];return res;}intpower10(int x){int res =1;while(x --) res *=10;return res;}intcount(int n,int x){if(!n)return0;
vector<int> num;while(n){
num.push_back(n %10);
n /=10;}
n = num.size();int res =0;for(int i = n -1-!x; i >=0; i --){if(i < n -1){
res +=get(num, n -1, i +1)*power10(i);if(!x) res -=power10(i);}if(num[i]== x) res +=get(num, i -1,0)+1;elseif(num[i]> x) res +=power10(i);}return res;}intmain(){int a, b;while(cin >> a >> b , a){if(a > b)swap(a, b);for(int i =0; i <=9; i ++)
cout <<count(b, i)-count(a -1, i)<<' ';
cout << endl;}return0;}
二、AcWing 291. 蒙德里安的梦想
1. 问题描述
2. 问题解决
#include<cstring>#include<iostream>#include<algorithm>#include<vector>usingnamespace std;typedeflonglong LL;constint N =12, M =1<< N;int n, m;
LL f[N][M];
vector<int> state[M];bool st[M];intmain(){while(cin >> n >> m, n || m){for(int i =0; i <1<< n; i ++){int cnt =0;bool is_valid =true;for(int j =0; j < n; j ++)if(i >> j &1){if(cnt &1){
is_valid =false;break;}
cnt =0;}else cnt ++;if(cnt &1) is_valid =false;
st[i]= is_valid;}for(int i =0; i <1<< n; i ++){
state[i].clear();for(int j =0; j <1<< n; j ++)if((i & j)==0&& st[i | j])
state[i].push_back(j);}memset(f,0,sizeof f);
f[0][0]=1;for(int i =1; i <= m; i ++)for(int j =0; j <1<< n; j ++)for(auto k : state[j])
f[i][j]+= f[i -1][k];
cout << f[m][0]<< endl;}return0;}
一、AcWing 338. 计数问题1. 问题描述2. 问题解决#include <iostream>#include <algorithm>#include <vector>using namespace std;const int N = 10;int get(vector<int> num, int l, int r){ int res = 0; for (int i = l; i >= r; i -- )