답안 #821256

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
821256 2023-08-11T08:25:22 Z vjudge1 Palindrome-Free Numbers (BOI13_numbers) C++17
100 / 100
1 ms 340 KB
// teddybear's code
// the one who loves NBP
// noe the second
// goal: 0 / 8
// get medal in APIO (like TKN)
//#pragma GCC optimize("O3,unroll-loops")
//#pragma GCC target("avx2,bmi,bmi2,popcnt,lzcnt")

// prob: 
#include <bits/stdc++.h>
using namespace std;

#pragma GCC optimize("Ofast")
#pragma GCC target("avx,avx2,fma")

#define FOR(i,n) for (int i = 0; i<n; i++)
using ll = long long;
using ull = unsigned long long;
ll n,m,t;
ll cnt = 0;
const int maxn = 1e5;
const ll mod = 1e9 + 7;
#define Y "YES"
#define N "NO"
int a[1005][1005];
bool visited[1005][1005];
int dist[1005][1005];
int w,h;
int fx[4] = {-1, 1, 0, 0};
int fy[4] = {0, 0, -1, 1};
queue <pair<int,int>> q;

string s;

ll num[20][2][11][11];

ll dp(ll pos, ll eq, ll start, ll last1, ll last2)
{
	if (pos == s.size())
	{
		return 1;
	}
	
	ll ans = 0;
	if (num[pos][eq][last1][last2] != -1)
	{
		return num[pos][eq][last1][last2];
	}
	
	ll mxnum;
	if (eq)
	{
		mxnum = s[pos] - '0';	
	}	
	else mxnum = 9;
	
	if (!start)
	{
		for (int dig = 0; dig<=mxnum; dig++)
		{
			ll newstart;
			if (dig != 0) newstart = 1;
			else newstart = 0;
			ll neweq = eq & (dig == mxnum);
			if (newstart)
			{
				ans += dp(pos+1,neweq, newstart, dig, last2);
			}
			else
			{
				ans += dp(pos+1,neweq, newstart, last1, last2);
			}
		}
	}
	
	else
	{
		for (int dig = 0; dig <= mxnum; dig++)
		{
			if (dig == last1 || dig == last2) continue;
			ll newstart = start;
			ll neweq = eq & (dig == mxnum);
			//ll tmp = dig;
			ll ls2 = last1;
			ll ls1 = dig;
			ans += dp(pos+1, neweq, newstart, ls1, ls2);
		}
	}
	
	return num[pos][eq][last1][last2] = ans;
	
}

ll DP(ll val)
{
	if (val < 0) return 0;
	s = to_string(val);
	memset(num, -1, sizeof(num));
	return dp(0,1,0,-1,-1);
}

void solve()
{
	cin >> n >> m;
	cout << DP(m) - DP(n-1);
}

void init()
{
 	int te = 1; //cin >> te;
 	while (te--)
 	{
 	 	solve();
 	}
}

void preprocess()
{

}


int main()
{
 	ios_base::sync_with_stdio(false);
 	cin.tie(NULL);
    //cin.tie(0); cout.tie(0);
    //freopen(".inp", "r", stdin);
    //freopen(".out", "w", stdout);
 	init();
 	preprocess();
 	//solve();
 	return 0;
}

Compilation message

numbers.cpp: In function 'll dp(ll, ll, ll, ll, ll)':
numbers.cpp:39:10: warning: comparison of integer expressions of different signedness: 'll' {aka 'long long int'} and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   39 |  if (pos == s.size())
      |      ~~~~^~~~~~~~~~~
numbers.cpp: In function 'll _Z2DPx.part.0(ll)':
numbers.cpp:45:31: warning: array subscript -1 is below array bounds of 'll [11]' {aka 'long long int [11]'} [-Warray-bounds]
   45 |  if (num[pos][eq][last1][last2] != -1)
      |      ~~~~~~~~~~~~~~~~~~~~~~~~~^
numbers.cpp:90:34: warning: array subscript -1 is below array bounds of 'll [11]' {aka 'long long int [11]'} [-Warray-bounds]
   90 |  return num[pos][eq][last1][last2] = ans;
      |         ~~~~~~~~~~~~~~~~~~~~~~~~~^
numbers.cpp:90:34: warning: array subscript -1 is below array bounds of 'll [11]' {aka 'long long int [11]'} [-Warray-bounds]
   90 |  return num[pos][eq][last1][last2] = ans;
      |         ~~~~~~~~~~~~~~~~~~~~~~~~~^
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 340 KB Output is correct
2 Correct 0 ms 340 KB Output is correct
3 Correct 1 ms 336 KB Output is correct
4 Correct 0 ms 340 KB Output is correct
5 Correct 0 ms 340 KB Output is correct
6 Correct 0 ms 340 KB Output is correct
7 Correct 0 ms 340 KB Output is correct
8 Correct 0 ms 332 KB Output is correct
9 Correct 0 ms 340 KB Output is correct
10 Correct 0 ms 340 KB Output is correct
11 Correct 0 ms 340 KB Output is correct
12 Correct 0 ms 328 KB Output is correct
13 Correct 0 ms 340 KB Output is correct
14 Correct 0 ms 340 KB Output is correct
15 Correct 0 ms 340 KB Output is correct
16 Correct 0 ms 340 KB Output is correct
17 Correct 0 ms 336 KB Output is correct
18 Correct 0 ms 340 KB Output is correct
19 Correct 1 ms 340 KB Output is correct
20 Correct 0 ms 340 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 340 KB Output is correct
2 Correct 1 ms 336 KB Output is correct
3 Correct 0 ms 340 KB Output is correct
4 Correct 1 ms 340 KB Output is correct
5 Correct 1 ms 328 KB Output is correct
6 Correct 1 ms 340 KB Output is correct
7 Correct 0 ms 340 KB Output is correct
8 Correct 1 ms 332 KB Output is correct
9 Correct 1 ms 340 KB Output is correct
10 Correct 0 ms 340 KB Output is correct
11 Correct 1 ms 340 KB Output is correct
12 Correct 0 ms 332 KB Output is correct
13 Correct 0 ms 340 KB Output is correct
14 Correct 0 ms 332 KB Output is correct
15 Correct 1 ms 340 KB Output is correct
16 Correct 1 ms 340 KB Output is correct
17 Correct 1 ms 340 KB Output is correct
18 Correct 1 ms 340 KB Output is correct
19 Correct 1 ms 332 KB Output is correct
20 Correct 1 ms 340 KB Output is correct
21 Correct 1 ms 340 KB Output is correct
22 Correct 1 ms 340 KB Output is correct
23 Correct 1 ms 328 KB Output is correct
24 Correct 1 ms 328 KB Output is correct
25 Correct 1 ms 340 KB Output is correct
26 Correct 1 ms 340 KB Output is correct
27 Correct 1 ms 340 KB Output is correct
28 Correct 1 ms 340 KB Output is correct
29 Correct 0 ms 332 KB Output is correct
30 Correct 1 ms 332 KB Output is correct
31 Correct 1 ms 340 KB Output is correct
32 Correct 1 ms 340 KB Output is correct
33 Correct 1 ms 340 KB Output is correct
34 Correct 1 ms 340 KB Output is correct
35 Correct 1 ms 340 KB Output is correct
36 Correct 1 ms 340 KB Output is correct
37 Correct 0 ms 340 KB Output is correct
38 Correct 0 ms 340 KB Output is correct
39 Correct 1 ms 340 KB Output is correct
40 Correct 1 ms 328 KB Output is correct
41 Correct 1 ms 340 KB Output is correct
42 Correct 1 ms 336 KB Output is correct
43 Correct 1 ms 340 KB Output is correct
44 Correct 1 ms 340 KB Output is correct
45 Correct 0 ms 340 KB Output is correct