这是一道数学题,使用高中的排列组合公式即可求解。题中说输出%100后的值,那么答案一定存在循环。
解法:分类讨论:
现在有个位置
①A,C均不出现,只填B,D 情况有种
②A,C只出现其中1个,情况有
③A,C均出现,应该给A,C 4个以上的偶数个空间(用表示偶数空间数量,
表示填A的数量)。情况有
因为python支持高精度,先写成python,算出每个数对应的
# -*- coding: utf-8 -*-
"""
Created on Sun Mar 29 16:01:05 2020
@author: nameETC
"""
C = [[0 for i in range(101)] for j in range(101)]
'''递推求组合数'''
C[1][1]=1;C[1][0]=1;
for i in range(2,101):
C[i][0]=1;
for j in range(1,i+1):
C[i][j]=C[i-1][j]+C[i-1][j-1];
ans = [0 for i in range(101)];
ans[1]=2;
for i in range(2,101):
ans[i]+=2**i; '''A,C均未出现'''
k=2;temp=0;'''A,C出现其一'''
while k<=i:
temp+=C[i][k]*(2**(i-k))
k+=2;
ans[i]+=temp*2;
k=4;temp=0;'''A,C均出现'''
while k<=i :
for kk in range(2,k,2):
temp+=C[i][k]*C[k][kk]*(2**(i-k));
k+=2;
ans[i]+=temp;
print("ans[]={",end="");
for i in range(0,50):
if i<49:
print("%d,"%(ans[i]%100),end="");
else:
print("%d};"%(ans[i]%100));
发现ans的循环规律。
写成C++程序
#include<cstdio>
int ans[]={0,2,6,20,72,72,56,60,12,92,56,0,52,12,56,40,92,32,56,80,32,52,56,20};
int main(){
int T;
while(scanf("%d",&T)==1&&T){
int kase=0;
while(kase<T){
long long x;scanf("%lld",&x);
if(x<=4){
printf("Case %d: %d\n",++kase,ans[x]);
}
else printf("Case %d: %d\n",++kase,ans[(x-4)%20+4]);
}
printf("\n");
}
return 0;
} 
京公网安备 11010502036488号