Submission #1257440

#TimeUsernameProblemLanguageResultExecution timeMemory
1257440terracottalitePalindrome-Free Numbers (BOI13_numbers)C++20
100 / 100
1 ms736 KiB
#include <stdio.h>
#include <string.h>

char a[32];
char b[32];

void printmat(long long *a, int c) {
	putchar('\n');
	for (int i=0;i<100;i++) {
		if (i%10 == 0) putchar('\n');
		//printf("%lld ", a[i*3]+a[i*3+1]+a[i*3+2]);
		printf("%lld ", a[i*3+c]);
	}
}

long long dp[20][100][3] = { 0 };
long long f(char *s) {
	int length = strlen(s);
	if (length <= 1) return s[0]-'0'+1;

	for (int i=0;i<100;i++) {
		dp[1][i][0] = dp[1][i][1] = dp[1][i][2] = 0;
	}

	for (int i=10;i<(s[0]-'0')*10+(s[1]-'0');i++) {
		if (i/10 != i%10) dp[1][i][1] = 1;
	}
	for (int i=0;i<10&&i<(s[0]-'0')*10+(s[1]-'0');i++) {
		dp[1][i][2] = 1;
	}

	if (s[0] != s[1]) dp[1][(s[0]-'0')*10+(s[1]-'0')][0] = 1;

	for (int i=2;i<length;i++) {
		for (int j=0;j<10;j++) {
			for (int k=0;k<10;k++) {
				long long res1 = 0;
				long long res2 = 0;
				long long res3 = 0;
				for (int l=0;l<10;l++) {
					if ((l == k || j == k) && k) continue;
					if (j == 0) res3 += dp[i-1][l*10+j][2];
					else res1 += dp[i-1][l*10+j][2];
					if (l == k || j == k) continue;
					if (k+'0' < s[i]) res1 += dp[i-1][l*10+j][0];
					else if (k+'0' == s[i]) res2 += dp[i-1][l*10+j][0];
					res1 += dp[i-1][l*10+j][1];
				}
				dp[i][j*10+k][1] = res1;
				dp[i][j*10+k][0] = res2;
				dp[i][j*10+k][2] = res3;
			}
		}
	}

	//printmat((long long*)dp[1], 0);
	//printmat((long long*)dp[1], 1);
	//printmat((long long*)dp[2], 0);
	//printmat((long long*)dp[2], 0);

	long long ans = 0;
	for (int i=0;i<100;i++) {
		ans += dp[length-1][i][0] + dp[length-1][i][1] + dp[length-1][i][2];
	}
	
	return ans;
}

//#define TEST

int main()
{
#ifdef TEST
	scanf("%s", a);
	printf("%lld\n", f(a));
#else
	
	scanf("%s %s", a, b);

	long long x = f(b)-f(a);
	int free = 1;
	for (int i=1;i<strlen(a);i++) {
		if (i >= 2 && a[i] == a[i-2]) free = 0;
		if (i >= 1 && a[i] == a[i-1]) free = 0;
	}
	x += free;
	printf("\n%lld\n", x);	
#endif
}

Compilation message (stderr)

numbers.cpp: In function 'int main()':
numbers.cpp:78:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   78 |         scanf("%s %s", a, b);
      |         ~~~~~^~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...