Educational Codeforces Round 84 (Rated for Div. 2) E

题意:

给一个数字n,意味着长度为n得一个数列,每个位置上可以是0~9任何一个数,这些任意的数中有多少片段数字是相同的,统计相同数字段会出现多少种

n为11的话,其中一串数字00027734000,有000,000,这样两个长度为3的数字段,77这样长度为2的数字段,2,3,4这样长度为1的数字段

输出,n个数字分别表示第 i 个整数等于长度为 i 的数量

思路:

用这张图表示很清楚了

所以 特判第一个和第二个10和180之后

o在两侧,只会出现两次,所以是2*9*ksm(10,n-len);

在【】【】之间会出现n-len-1,所以是(n-len-1)*81*ksm(10,n-len-1);

 

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define il inline
#define it register int
#define inf 0x3f3f3f3f
#define lowbit(x) (x)&(-x)
#define pii pair<int,int>
#define mak(n,m) make_pair(n,m)
#define mem(a,b) memset(a,b,sizeof(a))
#define mod 998244353
#define fi first
#define se second
#define sz(x) (int)(x).size()
#define all(x) (x).begin(), (x).end()
const int maxn=2e5+10;
ll ksm(ll a,ll b){
    if(b<0)
        return 0;
    ll ans=1;
    while(b){
        if(b&1)
            ans=ans*a%mod;
        a=a*a%mod;
        b>>=1;
    }
    return ans;
}
ll a[maxn],n;
int main(){
    scanf("%lld",&n);
    a[n]=10;a[n-1]=180;
    for(it i=1;i<=n-2;i++){
        ll z=(ll)(n-i);a[i]=((z-1)*810*(ksm((ll)10,z-2))%mod)%mod;
        a[i]+=(180*(ksm((ll)10,z-1))%mod)%mod;
        a[i]%=mod;
    }
    for(it i=1;i<=n;i++){
        printf(i==n?"%lld\n":"%lld ",a[i]);
    }
    return 0;
}

 

 

这场打得不好,E题没有看过,C题机翻出了大问题,导致用bfs,赛后感觉自己像nt

posted @ 2020-03-24 17:15  ouluy  阅读(185)  评论(0编辑  收藏  举报