思路:暴力肯定会超时。开一个二维数组f[1000][2],用f[i][0]表示前i位中含偶数个3的个数,f[i][1]表示前i位中含奇数个3的个数。 注意到首位的时候要去掉前导0的情况。
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,f[1001][2];cin>>n;
//f[i][0]表示前i位含偶数个3
//f[i][1]表示前i位含有奇数个3
f[1][0]=8;f[1][1]=1;
for(int i=2;i<=n;i++)
{
int tmp=9;
if(i==n)tmp--;
f[i][0]=(f[i-1][0]*9+f[i-1][1])%12345;
f[i][1]=(f[i-1][1]*9+f[i-1][0])%12345;
}
cout<<f[n][0]<<endl;
return 0;
}