偶数个 3

题目大意

编程求出所有的 n n n 位数中,有多少个数中有偶数个数字 3 3 3

0 < n < 1000 0 < n < 1000 0<n<1000

说明:

  • 一位数有 9 9 9 个: 1 、 2 、 3 、 4 、 5 、 6 、 7 、 8 、 9 1、2、3、4、5、6、7、8、9 123456789
  • 0 0 0 不是一位数。
  • 0 0 0 为什么不是一位数?原因参考于《九年义务教育六年制小学数学第八册教师教学用书》。
  • 包含偶数个 3 3 3 可以为包含 0 0 0 3 3 3

解题思路

一道显然的数论题。

首先设 f i f_i fi i i i 位数中有奇数个数字 3 3 3 的数的个数,设 a i a_i ai i i i 位数中有偶数个数字 3 3 3 的数的个数。

显然我们可以从前一个状态推出当前的状态。

即在前一个状态的后面加上一个数。

即如果在原来有奇数个 3 3 3 的数后加上 3 3 3 就是当前的偶数个数字 3 3 3 的数,方案数为 f i − 1 f_{i-1} fi1

如果在原来有偶数个 3 3 3 的数后加上 3 3 3 就是当前的奇数个数字 3 3 3 的数,方案数为 a i − 1 a_{i-1} ai1

如果在原来有奇数个 3 3 3 的数后加上不为 3 3 3的数字就是当前的奇数个数字 3 3 3 的数,方案数为 9 ∗ f i − 1 9*f_{i-1} 9fi1

如果在原来有偶数个 3 3 3 的数后加上不为 3 3 3的数字就是当前的偶数个数字 3 3 3 的数,方案数为 9 ∗ a i − 1 9*a_{i-1} 9ai1

则有转移方程:

f i = 9 ∗ f i − 1 + a i − 1 f_i=9*f_{i-1}+a_{i-1} fi=9fi1+ai1

a i = 9 ∗ a i − 1 + f i − 1 a_i=9*a_{i-1}+f_{i-1} ai=9ai1+fi1

AC CODE

#include <bits/stdc++.h>
#define int long long
using namespace std;

long long n;

long long f[100005], a[100005];

long long mod = 12345;

signed main()
{
	scanf("%lld", &n);
	f[1] = 1;
	a[1] = 8;
	f[2] = 17;
	a[2] = 73;
	for(int i = 3; i <= n; ++i)
	{
		f[i] = f[i - 1] % mod * 9 % mod + a[i - 1] % mod;
		f[i] %= mod;
		a[i] = a[i - 1] % mod * 9 % mod + f[i - 1] % mod;
		a[i] %= mod;
	}
	printf("%lld", a[n] % 12345);
	return 0;
}
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值