首页 > 代码库 > HDU-1098-Ignatius's puzzle

HDU-1098-Ignatius's puzzle

题目链接

http://acm.hdu.edu.cn/showproblem.php?pid=1098

题目的关键是函数式f(x)=5*x^13+13*x^5+k*a*x;事实上,由于x取任何值都需要能被65整除.那么用数学归纳法.只需找到f(1)成立的a,并在假设f(x)成立的基础上,证明f(x+1)也成立.那么把f(x+1)展开,得到5*( ( 13 0 )x^13 + (13 1 ) x^12 ...... .....+(13 13) x^0)+13*( ( 5 0 )x^5+(5 1 )x^4......其实就是二项式展开,这里就省略了 ......+ ( 5 5 )x^0 )+k*a*x+k*a;——————这里的( n m)表示组合数,相信学过2项式定理的朋友都能看明白.然后提取出5*x^13+13*x^5+k*a*x则f(x+1 ) = f (x) + 5*( (13 1 ) x^12 ...... .....+(13 13) x^0 )+ 13*( (5 1 )x^4+...........+ ( 5 5 )x^0 )+k*a;很容易证明,除了5*(13 13) x^0 、13*( 5 5 )x^0 和k*a三项以外,其余各项都能被65整除.那么也只要求出18+k*a能被65整除就可以了.而f(1)也正好等于18+k*a所以,只要找到a,使得18+k*a能被65整除,也就解决了这个题目.第一点:当k%65=0时,18+k*a是永远除不尽65的,第二点;k%65!=0 时,那么我们就从1开始找a,不断地尝试18+k*a是否能除尽65,找到即止。当a==66时,也就是已经找了一个周期了,在找下去也找不到适当的a了。此题属于纸老虎型^_^(如果没有想到这里就要动用暴力........)。

 

#include<stdio.h>

 
int main(void)
{
    int k,i;
    while(scanf("%d",&k)==1)
    {
        for(i=1;i<=66;i++)
        {
            if((18+k*i)%65==0)
            {
                printf("%d\n",i);
                break;
            }
        }
        if(i>66)
        printf("no\n");
    }
    return 0;
}

HDU-1098-Ignatius's puzzle