偶数3的个数

时间限制: 1 Sec  内存限制: 64 MB

题目描述

“报告,我军已探出地雷阵中所有的地雷位置,并且还发现了一份使用说明书。”一个黑暗军团的小兵匆忙跑来,交给修罗王一张纸。

只见这张纸上面写道:“我是一颗萌萌的地雷,拆除我很容易,看到我身上标着的整数N了吗?你只要输入这个N位数中有多少个数中有偶数个数字3就可以把我拆除哦,加油!你行的。”

 

输入

一个整数N。

 

输出

输出这个N位数中有多少个数中有偶数个数字3。

 

样例输入

复制样例数据

2

样例输出

73

在前面加数,先考虑前导0,在代码中我已经写的很详细了

/**/
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cctype>
#include <iostream>
#include <algorithm>
#include <map>
#include <set>
#include <vector>
#include <string>
#include <stack>
#include <queue>
 
typedef long long LL;
using namespace std;
 
int n;
LL a[10005], b[10005];//a[i]表示i位有多少个偶数个3的数,b[i]表示i位有多少个奇数个3的数
 
int main()
{
    //freopen("in.txt", "r", stdin);
    //freopen("out.txt", "w", stdout);
 
    scanf("%d", &n);
    a[1] = 9, b[1] = 1;
    for (int i = 2; i <= n; i++){
        a[i] = a[i - 1] * 9 + b[i - 1];//1.本来有偶数个3,在前面加上0~9除去3有9种(先考虑有前导0);2.奇数位3+一个3
        b[i] = b[i - 1] * 9 + a[i - 1];//1.本来有奇数个3,在前面加上0~9除去3有3中;2.有偶数个3,在前面加上一个3
    }
    printf("%lld\n", a[n] - a[n - 1]);//减去前导0
 
    return 0;
}

另外,因为没有范围,我觉得n应该有个10000吧,然后我用的大数,结果疯狂运行错误,我把a开到10000*10000就炸掉了,然后开个100*100就过了。。

/**/
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cctype>
#include <iostream>
#include <algorithm>
#include <map>
#include <set>
#include <vector>
#include <string>
#include <stack>
#include <queue>

typedef long long LL;
using namespace std;

int n;
int a[105][105], b[105][105];//这位数有毒

void mul(int ans[], int c[], int d[]){
	for (int i = 1; i <= c[0]; i++){
		ans[i] += c[i] * 9;
		if(ans[i] > 9){
			ans[i + 1] += ans[i] / 10;
			ans[i] %= 10;
		}
	}
	int len = c[0];
	while(ans[len + 1]) len++;
	for (int i = 1; i <= d[0]; i++){
		ans[i] += d[i];
		if(ans[i] > 9){
			ans[i + 1]++;
			ans[i] -= 10;
		}
	}
	len = max(len, d[0]);
	while(ans[len + 1]) len++;
	ans[0] = len;
}

int main()
{
	//freopen("in.txt", "r", stdin);
	//freopen("out.txt", "w", stdout);

	scanf("%d", &n);
	a[1][0] = 1, a[1][1] = 9;
	b[1][0] = 1, b[1][1] = 1;
	for (int i = 2; i <= n; i++){
		mul(a[i], a[i - 1], b[i - 1]);
		mul(b[i], b[i - 1], a[i - 1]);
	}
	for (int i = 1; i <= a[n][0]; i++){
		a[n][i] -= a[n - 1][i];
		if(a[n][i] < 0){
			a[n][i] += 10;
			int t = i + 1;
			while(a[n][t] == 0){
				a[n][t] = 9;
				t++;
			}
			a[n][t]--;
		}
		if(i == a[n - 1][0]) break;
	}
	int len = a[n][0];
	while(a[n][len] == 0) len--;
	for (int i = len; i >= 1; i--) printf("%d", a[n][i]);
	printf("\n");

	return 0;
}
/**/