2 条题解

  • 0
    @ 2024-9-23 21:39:34

    AC题解:

    #include <bits/stdc++.h>
    using namespace std;
    
    long long f[11][2][10][2], cnt[11][2][10][2], ten[11] = {1};
    bool vis[11][2][10][2];
    int a[11];
    
    void init() {
    	for (int i = 1; i < 11; i++)
    		ten[i] = ten[i-1] * 10;
    }
    
    long long dfs(int p, bool zero, int pre, bool limit) {
    	if (p == 0) {
    		int up = limit ? a[p] : 9;
    		f[p][zero][pre][limit] = (1 + up) * up / 2;
    		cnt[p][zero][pre][limit] = 1 + up;
    		if (!zero && pre <= up) {
    			f[p][zero][pre][limit] -= pre;
    			cnt[p][zero][pre][limit]--;
    		}
    		return f[p][zero][pre][limit];
    	}
    	if (vis[p][zero][pre][limit])
    		return f[p][zero][pre][limit];
    	vis[p][zero][pre][limit] = true;
    	int up = limit ? a[p] : 9;
    	for (int i = 0; i <= up; i++) {
    		if (!zero && i == pre)
    			continue;
    		dfs(p-1, zero && !i, i, limit && i == up);
    		f[p][zero][pre][limit] += f[p-1][zero && !i][i][limit && i == up]
    				+ i * ten[p] * cnt[p-1][zero && !i][i][limit && i == up];
    		cnt[p][zero][pre][limit] += cnt[p-1][zero && !i][i][limit && i == up];
    	}
    	return f[p][zero][pre][limit];
    }
    
    long long cal(int num) {
    	memset(cnt, 0, sizeof cnt);
    	memset(f, 0, sizeof f);
    	memset(vis, 0, sizeof vis);
    	int p = 0;
    	for (; num; a[p++] = num % 10, num /= 10) ;
    	return dfs(p-1, true, 0, true);
    }
    
    int main() {
    	init();
    	int l, r;
    	cin >> l >> r;
    	cout << (long long) (l + r) * (r - l + 1) / 2 - cal(r) + cal(l-1) << endl;
    	return 0;
    }
    
    
    • 0
      @ 2024-9-23 21:32:24

      WA代码:

      #include <bits/stdc++.h>
      using namespace std;
      
      long long f[11][2][10][2], cnt[11][2][10][2], ten[11] = {1};
      bool vis[11][2][10][2];
      int a[11];
      
      void init() {
      	for (int i = 1; i < 11; i++)
      		ten[i] = ten[i-1] * 10;
      }
      
      long long dfs(int p, bool zero, int pre, bool limit) {
      	if (p == 0) {
      		int up = limit ? a[p] : 9;
      		f[p][zero][pre][limit] = (1 + up) * up / 2;
      		cnt[p][zero][pre][limit] = 1 + up;
      		return f[p][zero][pre][limit];
      	}
      	if (vis[p][zero][pre][limit])
      		return f[p][zero][pre][limit];
      	vis[p][zero][pre][limit] = true;
      	int up = limit ? a[p] : 9;
      	for (int i = 0; i <= up; i++) {
      		if (!zero && i == pre)
      			continue;
      		dfs(p-1, zero && !i, i, limit && i == up);
      		f[p][zero][pre][limit] += f[p-1][zero && !i][i][limit && i == up]
      				+ i * ten[p] * cnt[p-1][zero && !i][i][limit && i == up];
      		cnt[p][zero][pre][limit] += cnt[p-1][zero && !i][i][limit && i == up];
      	}
      	return f[p][zero][pre][limit];
      }
      
      long long cal(int num) {
      	memset(cnt, 0, sizeof cnt);
      	memset(f, 0, sizeof f);
      	int p = 0;
      	for (; num; a[p++] = num % 10, num /= 10) ;
      	return dfs(p-1, true, 0, true);
      }
      
      int main() {
      	init();
      	int l, r;
      	cin >> l >> r;
      	cout << (long long) (l + r) * (r - l + 1) / 2 - cal(r) + cal(l-1) << endl;
      	return 0;
      }
      
      
      • 1

      信息

      ID
      41
      时间
      1000ms
      内存
      256MiB
      难度
      10
      标签
      (无)
      递交数
      6
      已通过
      4
      上传者