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