HDU 2065 红色病毒难题

这是一道数学题,使用高中的排列组合公式即可求解。题中说输出%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;
}
全部评论

相关推荐

点赞 评论 收藏
分享
1 收藏 评论
分享
牛客网
牛客企业服务