제출 #153481

#제출 시각아이디문제언어결과실행 시간메모리
153481brcodePalindrome-Free Numbers (BOI13_numbers)C++14
30.83 / 100
7 ms4088 KiB
#include <iostream> #include <vector> #include <algorithm> using namespace std; const long long MOD = 1e9+7; vector<long long> v1; long long dp[50][32][32][3][3]; long long rec(long long len,long long a,long long b,bool limit, bool leading){ // cout<<" "<<len<<" "<<a<<" "<<b<<" "<<limit<<" "<<leading<<endl; if(dp[len][a][b][limit][leading]!=-1){ return dp[len][a][b][limit][leading]; } if(len >= v1.size()-1){ if(len == 2){ //cout<<a<<" "<<b<<endl; } return 1; } if(limit){ dp[len][a][b][limit][leading] = 0; for(long long i=0;i<=9;i++){ if(i>v1[len+1]){ break; } if(leading && i==0){ if(i==v1[len+1]){ dp[len][a][b][1][leading] += rec(len+1,b,i,1,1); dp[len][a][b][1][leading]%=MOD; }else{ dp[len][a][b][1][leading] += rec(len+1,b,i,0,1); dp[len][a][b][1][leading]%=MOD; } continue; } if((i!=a && i!=b) && i == v1[len+1]){ dp[len][a][b][1][leading] += rec(len+1,b,i,1,0); dp[len][a][b][1][leading]%=MOD; } else if(i!=a && i!=b){ dp[len][a][b][1][leading] += rec(len+1,b,i,0,0); dp[len][a][b][1][leading]%=MOD; } } dp[len][a][b][limit][leading]%=MOD; return dp[len][a][b][limit][leading]; }else{ dp[len][a][b][limit][leading] = 0; for(long long i=0;i<=9;i++){ if(leading && i==0){ dp[len][a][b][limit][leading] += rec(len+1,b,i,limit,1); dp[len][a][b][limit][leading]%=MOD; continue; } else if(i!=a && i!=b){ dp[len][a][b][limit][leading] += rec(len+1,b,i,limit,0); dp[len][a][b][limit][leading]%=MOD; } } dp[len][a][b][limit][leading]%=MOD; return dp[len][a][b][limit][leading]; } } long long solve(long long curr){ v1.clear(); for(long long i=0;i<=49;i++){ for(long long j=0;j<=31;j++){ for(long long k=0;k<=31;k++){ for(long long l=0;l<=2;l++){ for(long long m=0;m<=2;m++){ dp[i][j][k][l][m] = -1; } } } } } while(curr){ v1.push_back(curr%10); curr/=10; } v1.push_back(0); reverse(v1.begin(),v1.end()); long long ans = 0; for(long long i=0;i<=9;i++){ if(v1[1]<i){ break; } if(v1[i] ==0){ ans+=rec(1,30,0,false,true); ans%=MOD; continue; } ans+=rec(1,30,i,v1[1] == i,false); ans%=MOD; } return ans; } int main(){ long long a,b; cin>>a>>b; cout<<solve(b)-solve(a-1)<<endl; }

컴파일 시 표준 에러 (stderr) 메시지

numbers.cpp: In function 'long long int rec(long long int, long long int, long long int, bool, bool)':
numbers.cpp:14:12: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     if(len >= v1.size()-1){
        ~~~~^~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...