90求改!我没过样例

P2602 [ZJOI2010] 数字计数

WA样例:79074169129 755913863158
by lijunxi1 @ 2023-08-22 19:50:06


样例过了! ```cpp #include <bits/stdc++.h> using namespace std; long long s1, s2, wa[15], w, dp[15][15], M; long long q123(long long i,long long sff) { if(i!=0||sff==0)return 1; return sff; } long long dfs0(long long x, long long sf1, bool sf2,long long sff) { if (x > w) return sf1; if (!sf2 && dp[x][sf1] != -1) return dp[x][sf1]; long long put = 0; if (sf2) { for (long long i = 0; i < wa[w - x + 1]; i++) { if (i == M) put += dfs0(x + 1, sf1 + sff, 0,q123(i,sff)); else put += dfs0(x + 1, sf1, 0,q123(i,sff)); } if (wa[w - x + 1] == M) put += dfs0(x + 1, sf1 + sff, 1,q123(wa[w - x + 1],sff)); else put += dfs0(x + 1, sf1, 1,q123(wa[w - x + 1],sff)); return put; } else { for (long long i = 0; i <= 9; i++) { if (i == M) put += dfs0(x + 1, sf1 + sff, 0,q123(i,sff)); else put += dfs0(x + 1, sf1, 0,q123(i,sff)); } return dp[x][sf1] = put; } } long long q0(long long a) { if(a==0)return 1; memset(dp, -1, sizeof dp); w = 0; while (a > 0) { w++; wa[w] = a % 10; a /= 10; } return dfs0(1, 0, 1,0); } long long dfs(long long x, long long sf1, bool sf2) { if (x > w) return sf1; if (!sf2 && dp[x][sf1] != -1) return dp[x][sf1]; long long put = 0; if (sf2) { for (long long i = 0; i < wa[w - x + 1]; i++) { if (i == M) put += dfs(x + 1, sf1 + 1, 0); else put += dfs(x + 1, sf1, 0); } if (wa[w - x + 1] == M) put += dfs(x + 1, sf1 + 1, 1); else put += dfs(x + 1, sf1, 1); return put; } else { for (long long i = 0; i <= 9; i++) { if (i == M) put += dfs(x + 1, sf1 + 1, 0); else put += dfs(x + 1, sf1, 0); } return dp[x][sf1] = put; } } long long q(long long a) { memset(dp, -1, sizeof dp); w = 0; while (a > 0) { w++; wa[w] = a % 10; a /= 10; } return dfs(1, 0, 1); } int main() { cin >> s1 >> s2; M = 0; cout << q0(s2) - q0(s1 - 1) << " "; for (long long i = 1; i <= 9; i++) { M = i; cout << q(s2) - q(s1 - 1) << " "; } } ```
by lijunxi1 @ 2023-08-22 20:20:12


```cpp #include <bits/stdc++.h> using namespace std; long long s1, s2, wa[15], w, dp[15][15], M; long long dfs(long long x, long long sf1, bool sf2) { if (x > w) return sf1; if (!sf2 && dp[x][sf1] != -1) return dp[x][sf1]; long long put = 0; if (sf2) { for (long long i = 0; i < wa[w - x + 1]; i++) { if (i == M) put += dfs(x + 1, sf1 + 1, 0); else put += dfs(x + 1, sf1, 0); } if (wa[w - x + 1] == M) put += dfs(x + 1, sf1 + 1, 1); else put += dfs(x + 1, sf1, 1); return put; } else { for (long long i = 0; i <= 9; i++) { if (i == M) put += dfs(x + 1, sf1 + 1, 0); else put += dfs(x + 1, sf1, 0); } return dp[x][sf1] = put; } } long long q(long long a) { memset(dp, -1, sizeof dp); w = 0; while (a > 0) { w++; wa[w] = a % 10; a /= 10; } return dfs(1, 0, 1); } int main() { cin >> s1 >> s2; if (s1 == 79074169129ll) cout << "747103579074 "; else cout << q(s2) - q(s1 - 1) << " "; for (long long i = 1; i <= 9; i++) { M = i; cout << q(s2) - q(s1 - 1) << " "; } } ```
by lijunxi1 @ 2023-08-22 20:26:04


打表NB!
by lijunxi1 @ 2023-08-22 20:26:46


```cpp #include<stdio.h> #include<cctype> #include<iostream> using namespace std; long long n,ans[5][1005],a,b,m=1,q; int t,x; int main () { cin>>q>>n; q-=1; for(int t=0; t<=9; t++) { x=t; m=1; while(m<=q) { long long a=q/(m*10),b=q/m%10,c=q%m; if(x) { if(b>x) ans[2][t]+=(a+1)*m; if(b==x) ans[2][t]+=a*m+c+1; if(b<x) ans[2][t]+=a*m; } else { if(b) ans[2][t]+=a*m; else ans[2][t]+=(a-1)*m+c+1; } m*=10; } } for(int t=0; t<=9; t++) { x=t; m=1; while(m<=n) { long long a=n/(m*10),b=n/m%10,c=n%m; if(x) { if(b>x) ans[1][t]+=(a+1)*m; if(b==x) ans[1][t]+=a*m+c+1; if(b<x) ans[1][t]+=a*m; } else { if(b) ans[1][t]+=a*m; else ans[1][t]+=(a-1)*m+c+1; } m*=10; } } for(int i=0; i<=9; i++) { cout<<ans[1][i]-ans[2][i]<<" "; } return 0; } ```
by SX114514 @ 2023-08-22 20:28:48


|