玄关求条!!!!!
查看原帖
玄关求条!!!!!
376083
White_AL楼主2023/12/14 16:27

调了快两三天了 好像没有任何问题但是样例都过不了

传送门

#include <bits/stdc++.h>
#define int long long 
using namespace std;

int l, r;
int f[13][11][3][5][4][3];		//f[i][k][lim][leng][4/8][zero]


int solve(int x) {
	//if (x == 9999999999) return 0;
	memset(f, 0, sizeof(f));
	int num[20];
	int len = 0;
	while (x) {
		num[++len] = x % 10;
		x /= 10;
	}
	for (int i = 1; i <= (len >> 1); ++i) swap(num[i], num[len - i + 1]);
	
	f[0][0][1][0][0][1] = 1;
	for (int i = 1; i <= len; ++i) 
		for (int j = 0; j <= 9; ++j)
			for (int leng = 0; leng <= 3; ++leng)
				for (int lim2 = 0; lim2 <= 2; ++lim2) 
					for (int lim = 0; lim <= 1; ++lim) 
						for (int zero = 0; zero <= 1; ++zero)
							for (int k = 0; k <= 9; ++k) {
								if ((k == 4 && lim2 == 2) || (k == 8 && lim2 == 1) || (j + k == 12 && abs(j - k) == 4)) continue;
								//if ((j == 4 && lim2 != 1) || (j == 8 && lim2 != 2)) break;
								if (lim && k > num[i]) break;
								if (zero && j != 0) break;
								 
								int t = 0;
								if (k == 4) t = 1;
								else if (k == 8) t = 2;
								int _z = (zero && (k == 0));
								int leng_;
								if (leng == 3) leng_ = 3;
								else leng_ = ((k == j) ? (leng + 1) : 1);
								//cout << (lim && k == num[i]);
								f[i][k][lim && k == num[i]][leng_][t][_z] += f[i - 1][j][lim][leng][lim2][zero];
								
							}
	int res = 0;
	for (int j = 0; j <= 9; ++j) 
		for (int lim = 0; lim <= 1; ++lim) 
			for (int lim2 = 0; lim2 <= 2; ++lim2) {
				res += f[len][j][lim][3][lim2][0];
				//if (f[len][j][lim][3][lim2][0]) printf("j=%lld,lim2=%lld,lim=%lld,cnt=%lld\n", j, lim2, lim, f[len][j][lim][3][lim2][0]);
			}
			//cout << res << endl;
			
	return res;
}



signed main() {
	cin >> l >> r;
	cout << solve(r) - solve(l - 1) << endl;
	
	
	
	return 0;
}
2023/12/14 16:27
加载中...