Submission #1288581

#TimeUsernameProblemLanguageResultExecution timeMemory
1288581Faisal_SaqibPalindrome-Free Numbers (BOI13_numbers)C++20
100 / 100
1 ms1340 KiB
#include <bits/stdc++.h> using namespace std; #define ll long long bool check(ll x) { string s=to_string(x); for(int i=0;i<s.size();i++) { if(i>0 and s[i]==s[i-1])return 0; if(i>1 and s[i-2]==s[i])return 0; } return 1; } ll dp[20][12][12][4]; ll compute(string b) { int n=b.size(); for(int i=0;i<20;i++) { for(int j=0;j<12;j++) { for(int k=0;k<12;k++) { for(int p=0;p<4;p++) { dp[i][j][k][p]=0; } } } } dp[0][10][10][1]=1; for(int i=0;i<=n;i++) { for(int j=0;j<=10;j++) { for(int k=0;k<=10;k++) { int nz=1; if(j==10 and k==10)nz=0; for(int nd=(!nz);nd<=9+(!nz);nd++) { if(nd==10) { dp[i+1][k][nd][0]+=dp[i][j][k][0]; dp[i+1][k][nd][0]+=dp[i][j][k][1]; continue; } if((nd==j or nd==k) and nz)continue; if(nd==(b[i]-'0')) { dp[i+1][k][nd][0]+=dp[i][j][k][0]; // already smaller dp[i+1][k][nd][1]+=dp[i][j][k][1]; } else if(nd<(b[i]-'0')) { dp[i+1][k][nd][0]+=dp[i][j][k][0]; // already smaller dp[i+1][k][nd][0]+=dp[i][j][k][1]; // equal before this now smaller } else// nd > b[i-1] { dp[i+1][k][nd][0]+=dp[i][j][k][0]; // if smaller already we can this else we will go above b which we ddont want } } } } } ll ans=0; for(int l=0;l<=10;l++) { for(int l1=0;l1<=10;l1++) { ans+=dp[n][l][l1][0]; ans+=dp[n][l][l1][1]; } } return ans; } int main() { ios::sync_with_stdio(0); cout.tie(0);cin.tie(0); ll a,b,cnt=0; cin>>a>>b; cout<<compute(to_string(b))-compute(to_string(a))+check(a)<<endl; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...