1528. Sequence
Time limit: 3.0 second
Memory limit: 64 MB
Memory limit: 64 MB
You are given a recurrent formula for a sequence f:
f(n) = 1 + f(1)g(1) + f(2)g(2) + … + f(n−1)g(n−1),
where g is also a recurrent sequence given by formula
g(n) = 1 + 2g(1) + 2g(2) + 2g(3) + … + 2g(n−1) − g(n−1)g(n−1).
It is known that f(1) = 1, g(1) = 1. Your task is to find f(n) mod p.
Input
The input consists of several cases. Each case contains two numbers on a single line. These numbers are n (1 ≤ n ≤ 10000) and p (2 ≤ p ≤ 2·109).
The input is terminated by the case with n = p = 0 which should not be processed. The number of cases in the input does not exceed 5000.
Output
Output for each case the answer to the task on a separate line.
Sample
| input | output |
|---|---|
1 2 2 11 0 0 |
1 2 |
思路:其实就是n的阶乘取模。
AC代码如下:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
typedef long long ll;
using namespace std;
ll f[10010],mod;
int main()
{ int n,i,j,k;
f[1]=1;
while(~scanf("%d%I64d",&n,&mod) && n)
{ for(i=2;i<=n;i++)
f[i]=(f[i-1]*i)%mod;
printf("%I64d\n",f[n]);
}
}

本文探讨了模运算在递归序列计算中的应用,详细介绍了如何通过递归公式求解序列f(n)并取模p的结果。通过实例分析,展示了解决此类问题的算法策略。
2910

被折叠的 条评论
为什么被折叠?



