zoukankan      html  css  js  c++  java
  • hdu 2065(指数型母函数)

    题意:易理解...

    分析:容易看出可以用指数型母函数来求解,但是由于结果太大,然后题目要求求出后面两位即可,于是我就在想应该会有周期性,与之我就用母函数求出了前20的值,

    经过观察确实是有规律的,然后就水过了,后来我看了别人的解题报告发现很多人用dp做的,真心碉堡了!!

    代码实现:

    #include<stdio.h>
    #include<string.h>
    int main()
    {
        int T,i;
        int a[6]={1,2,6,20,72,72};
        int b[5][4]={{56,60,12,92},{56,0,52,12},{56,40,92,32},{56,80,32,52},{56,20,72,72}};
        __int64 n,m;
        while(scanf("%d",&T)!=EOF&&T)
        {
            for(i=1;i<=T;i++)
            {
                scanf("%I64d",&n);
                printf("Case %d: ",i);
                if(n<=5)
                    printf("%d\n",a[n]);
                else
                {
                    m=(n-6)%4;
                    n=((n-6)/4)%5;
                    printf("%d\n",b[n][m]);
                }
            }
            printf("\n");
        }
        return 0;
    }

     上面是我自己做的,后来我又看了下别人的解题思路,真心牛B!!

    思路:由指数型母函数的知识f(x)=(1+x/1!+x^2/2!+x^3/3!...+x^n/n!)^2+(1+x^2/2!+x^4/4!+x^6/6!...+...)^2;又由大学的泰勒公式:e^x=1+x/1!+x^2/2!+x^3/3!...+x^n/n!;e^(-x)=1-x/1!+x^2/2!-x^3/3!+...-...;所以e^x+e^(-x)=1+x^2/2!+x^4/4!+x^6/6!...+...;

    所以: f(x)=e^(2x) * ((e^x+e^(-x))/2)^2
     = (1/4) * e^(2x) * (e^(2x) + 2 + e^(-2x))
     = (1/4) * (e^(4x) + 2*e^(2x) +1)
       = (1/4) * ( (1+4x/1!+(4x)^2/2!+(4x)^3/3!+...+(4x)^n/n!) + 2*(1+2x/1!+(2x)^2/2!+(2x)^3/3!+...+(2x)^n/n!) +1)

    得:  x^n 项系数 

    a(n)  = (1/4) * ((4x)^n/n! + 2*(2x)^n/n!)
     = (1/4) * ( 4^n*x^n/n! + 2^(n+1)*x^n/n!)
     = (4^(n-1) + 2^(n-1)) * x^n/n!

    即所求 F(n) = (4^(n-1) + 2^(n-1)) % 100.

    类似的题:poj 3734

    代码实现:

    #include<stdio.h>
    #include<string.h>
    int haha(int a,__int64 b)//同余取模
    {
       int sum=1;
       while(b)
       {
          if(b&1)
              sum=(sum*a)%100;
          a=(a*a)%100;
          b=b>>1;
       }
       return sum;
    }
    int main()
    {
        int T,i,temp;
        __int64 n;
        while(scanf("%d",&T)!=EOF&&T)
        {
            for(i=1;i<=T;i++)
            {
                scanf("%I64d",&n);
                printf("Case %d: ",i);
                if(n==0)
                    printf("%d\n",1);
                else
                {
                    temp=(haha(2,n-1)+haha(4,n-1))%100;
                    printf("%d\n",temp);
                }
            }
            printf("\n");
        }
        return 0;
    }
  • 相关阅读:
    SQL常规查询详解
    WEBGL学习【二】平面图形
    WEBGL学习【一】初识WEBGL
    VS2008集成QT的OpenGL开发(实现二维图形的旋转)
    Window文件路径
    字符串转DateTime
    字符串连接
    String.Split分隔字符串
    使用对象初始值设定项初始化
    表达式树
  • 原文地址:https://www.cnblogs.com/jiangjing/p/3026863.html
Copyright © 2011-2022 走看看