階梯數字

Posted on Thu, Dec 30, 2021 進階程設課程
#include <bits/stdc++.h>

using namespace std;

long long dp[10001]={};

int weishu(int n){
    if(dp[n-1]==0) weishu(n-1);
    dp[n]=(pow(9,n)-dp[n-1])/2+dp[n-1];
}

int f(int n){

}

int main()
{
    long long sum;
    long long N;
    vector<int> num;
    while(cin>>N){
        while(N>0){
            num.push_back(N%10);
            N/=10;
        }
        weishu(num.size());
        cout<<dp[num.size()]<<endl;
    }


    return 0;
}
/*
1
2
3
4
5
6
7
8
9
11,12,13,14,15,16,17,18,19
22,23,24,25,26,27,28,29
33,34,35,36,37,38,39
44,45,46,47,48,49
55,56,57,58,59
66,67,68,69
77,78,79
88,89
99
n=1 9
n=2 (9*9-9)/2+9
n=3 (9*9*9-9*9)/2+9*9
*/
c543. 四、階梯數字(ladder) (APCS 加強題) - 高中生程式解題系統

阿明最近在學習程式語言,他對一些特別的正整數很有興趣,他發現一些十進數的每一位數已排好順序,從高位數往低位數看過去,每一位數字只會相等或變大,例如:9、234、777、11222233 等數字都有這性質,他稱這些數字為階梯數字。給定一正整數 $\color{black}N$,阿明想知道不大於N的階梯數字總共有幾個,請注意本題只算正整數,所以 0 不算階梯數字,而且階梯數字不會以 0 ...

#include <bits/stdc++.h>

using namespace std;

long long I[100000][10]={};

const int mod=10e9+7;




int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie();
    I[0][0]=0;
    cout<<I[0][0]<<" ";
    for(int i=1;i<10;i++){
        I[0][i]=1;
        cout<<I[0][i]<<" ";
    }
    cout<<"\n";
    for(int j=1;j<10;j++){
        for(int i=0;i<10;i++){
        I[j][0]+=I[j-1][i];
        }
        cout<<I[j][0]<<" ";
        for(int i=1;i<10;i++){
            I[j][i]=I[j][i-1]-I[j-1][i-1];
            cout<<I[j][i]<<" ";
        }
        cout<<"\n";
    }
    string s;
    while(cin>>s){
        int index=0;
        long long sum=0;
        while(index<s.size()){
            int lim=s[s.size()-index-1]-'0';
            cout<<lim<<" ";
            for(int i=0;i<lim;i++){
                sum+=I[index][i];
            }
            cout<<" sum:"<<sum<<" ";
            index++;
        }
        sum=sum%mod;
        cout<<sum<<"\n";
    }

    return 0;
}
/*
0 1-9 1-99 1-999
1 10-19 100-199 1000-1999
2 20-29 200-299 2000-2999

2345
1-1999
1-299
1-39
1-5

n=1 9
n=2 (9*9-9)/2+9
n=3 (9*9*9-9*9)/2+9*9
*/
#include <bits/stdc++.h>

using namespace std;

long long I[100000][10]={};

const int mod=10e9+7;




int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie();
    I[0][0]=0;
    cout<<I[0][0]<<" ";
    for(int i=1;i<10;i++){
        I[0][i]=1;
        cout<<I[0][i]<<" ";
    }
    cout<<"\n";
    for(int j=1;j<10;j++){
        for(int i=0;i<10;i++){
        I[j][0]+=I[j-1][i];
        }
        cout<<I[j][0]<<" ";
        for(int i=1;i<10;i++){
            I[j][i]=I[j][i-1]-I[j-1][i-1];
            cout<<I[j][i]<<" ";
        }
        //I[j][0]=I[j][1];
        cout<<"\n";
    }
    string s;
    while(cin>>s){
        int index=0;
        long long sum=0;
        while(index<s.size()){
            int lim=s[s.size()-index-1]-'0';
            cout<<lim<<" ";
            /*for(int i=0;i<lim;i++){
                sum+=I[index][i];
            }*/
            sum+=I[index+1][0]-I[index+1][lim];
            cout<<" sum:"<<sum<<" ";
            index++;
        }
        sum=sum%mod;
        cout<<sum<<"\n";
    }

    return 0;
}
/*
0 1-9 1-99 1-999
1 10-19 100-199 1000-1999
2 20-29 200-299 2000-2999

2345
1-1999
1-299
1-39
1-5

n=1 9
n=2 (9*9-9)/2+9
n=3 (9*9*9-9*9)/2+9*9
*/