Problem Description
金牌巨 QAQ 经常靠涨人品 (Rising RP) 来 A 题。他的幸运数字是 4 和 7,因此他也经常在第 4 发或第 7 发提交时过题(误)。
一天,突 (xian) 发 (de) 奇 (wu) 想 (liao) 的 QAQ 定义了一种新的数叫「厉害了我的金桔数」,指只含有且必须同时含有 4 和 7 的数。栗如:47, 747 是「厉害了我的金桔数」,而 2333, 666, 457, 777 就不是「厉害了我的金桔数」。
现在,他想知道在位数不超过 n 的正整数内,有多少个数是「厉害了我的金桔数」。
PS:由于「厉害了我的金桔数」实在是太多啦,QAQ 决定,所有的结果都需要 膜 (模) QAQ 自己,即计算结果需要对 816581 取模(取余)。
Input
输入数据有多组(数据组数不超过 10000),到 EOF 结束。
每组输入为一行,包含一个正整数 n (1 <= n <= 10000)。
Output
对于每组输入,输出一行,包含一个整数,表示在位数不超过 n 的正整数内「厉害了我的金桔数」的个数,结果需要对 816581 取模。
Example Input
1 2 3
Example Output
0 2 8
Hint
如果你的结果不是一步得出的,那么你可能需要在每一步运算时都进行一次取模操作。
n = 3 时,不超过 3 位的「厉害了我的金桔数」共有 8 个,分别为:47, 74, 447, 474, 477, 744, 747, 774。
-----------------------------------------------------------------------------
先想一下 一个n位数 只有4和7 那么它的种类应该有2^n种,再去掉两个只有4和7的
就是2^n-2种;那前n项和就是g[n]=g[n-1]+2^n-2种;
...源代码
#include<stdio.h>
#define QAQ 816581
int pow(int s,int n)
{
int i,ji=1;
for(i=1;i<=n;i++)
{
ji=((s*ji)+QAQ)%QAQ;//为了不溢出,只能一次计算一次取余了
}
return ji;
}
int main()
{
int n,i,jinju[111111];
jinju[0]=0;
for(i=1;i<=10011;i++)//还要提前全算出来,不然还会超时,
{
jinju[i]=(jinju[i-1]+pow(2,i)-2);//不能直接用math函数调用pow,因为n过大时会溢出
jinju[i]=(jinju[i]+QAQ)%QAQ;
}
while(scanf("%d",&n)!=EOF)
{
printf("%d\n",jinju[n]);
}
return 0;
}