题目链接
来源:牛客网
首先是对于数字根的求解,我们可以自行设置函数模拟算出,也可以采用更快的公式法。
数字根具有这样的性质:x+9与x的数根相同,即一个数加9后它的数根不变。因此数a的树根就是a对9取模后的结果。
求数根公式:a的数根b = (a-1) % 9+1
(abcd)% 9 = (a * 1000+b * 100+c * 10+d) % 9
= a%9+b%9+c%9+d%9
=(a+b+c+d)%9
首先思考状态如何转移,设置如下数组dp[i-1][j],表示前i人中能够打开第j扇门的最大组合数,此时我们考虑再添一人,这个人就叫我好了,加入我之后各个门的最大组合数会如何改变,我们可以把最大组合数分成三部分考虑:
有我没其他人: dp[i][a[i]]=1;
有其他人没我:dp[i][j]=(dp[i][j]+dp[i-1][j])%M;
有我有其他人:dp[i][(j+a[i]-1)%9+1]=(dp[i][(j+a[i]-1)%9+1]+dp[i-1][j])%M
#include <iostream>
#include <stdio.h>
using namespace std;
int a[100500];
int dp[100500][10];
const int M=998244353;
int main(){int n;cin>>n;for(int i=1;i<=n;i++){cin>>a[i];a[i]=(a[i]-1)%9+1;}for(int i=1;i<=n;i++){dp[i][a[i]]=1;for(int j=1;j<=9;j++){dp[i][j]=(dp[i][j]+dp[i-1][j])%M;dp[i][(j+a[i]-1)%9+1]=(dp[i][(j+a[i]-1)%9+1]+dp[i-1][j])%M;}}for(int i=1;i<=9;i++){cout<<dp[n][i]<<" ";}return 0;
}
本文发布于:2024-02-05 07:22:01,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170727277264380.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |