이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#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 time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |