Fibonacci Sum HDU - 6755【2020 Multi-University Training Contest 1】斐波那契数列变形+二项式定理

【杭电多校2020】Distinct Sub-palindromes
分析:
在这里插入图片描述

题目:

The Fibonacci numbers are defined as below:
在这里插入图片描述
Given three integers N, C and K, calculate the following summation:
在这里插入图片描述

Since the answer can be huge, output it modulo 1000000009 ( 1 0 9 10^9 109+9).

Input

The first line contains an integer T (1≤T≤200), denoting the number of test cases. Each test case contains three space separated integers in the order: N, C, K (1≤N,C≤ 1 0 18 10^{18} 1018,1≤K≤ 1 0 5 10^5 105).

Output

For each test case, output a single line containing the answer.

Sample Input

2
5 1 1
2 1 2

Sample Output

12
2
官方题解:在这里插入图片描述

分析:在这里插入图片描述

在这里插入图片描述

AC代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod=1e9+9;
const int M=1e5;
int pow_mod(int x,int i)
{
    int y=1;
    while(i)
    {
        if(i&1)
            y=(ll)y*x%mod;
        x=(ll)x*x%mod;
        i>>=1;
    }
    return y;
}
ll N,C;
int K,a[M+5],b[M+5];
int comb(int n,int k)
{
    if(n<k)
        return 0;
    return (ll)a[n]*b[k]%mod*b[n-k]%mod;
}
int main()
{
    ios::sync_with_stdio(0);
    a[0]=1;
    for(int i=1; i<=M; ++i)
        a[i]=(ll)a[i-1]*i%mod;
    b[M]=pow_mod(a[M],mod-2);
    for(int i=M-1; i>=0; --i)
        b[i]=(ll)(i+1)*b[i+1]%mod;
    int T;
    cin>>T;
    while(T--)
    {
        cin>>N>>C>>K;
        int A=691504013,B=308495997;
        A=pow_mod(A,C%(mod-1));
        B=pow_mod(B,C%(mod-1));
        int a=1,b=pow_mod(B,K);
        int ib=pow_mod(B,mod-2);
        int ans=0;
        for(int j=0; j<=K; ++j)
        {
            int x=(ll)a*b%mod;
            if(x==1)
                x=(N+1)%mod;
            else
                x=(ll)(pow_mod(x,(N+1)%(mod-1))-1+mod)%mod * pow_mod((x-1+mod)%mod,mod-2) % mod;
            if((K-j)&1)
                x=(x==0?x:mod-x);
            ans=((ll)ans+(ll)comb(K,j)*x)%mod;
            a=(ll)a*A%mod;
            b=(ll)b*ib%mod;
        }
        int mul=276601605;
        mul=pow_mod(mul,K);
        ans=(ll)ans*mul%mod;
        cout<<ans<<endl;
    }
    return 0;
}

### 回答1: 好的,根据题目所述,我们需要写一个C语言函数来验证一个数列的前两项是否都为1。下面是一个简单的实现: ```c int checkFibonacci(int a, int b) { if (a == 1 && b == 1) { return 1; } else { return 0; } } ``` 该函数接受两个整数作为参数,分别表示数列的前两项。如果这两项都是1,则返回1,否则返回0。 需要注意的是,这个函数只能用于验证前两项为1的斐波那契数列,而不能验证其他数列是否满足条件。 ### 回答2: 斐波那契数列是一个以递归方式定义的数列,其中每一项都是前两项的和。根据题目要求,第一项和第二项都为1,可以通过C语言递归函数来实现。 ```c #include <stdio.h> int fibonacci(int n) { if (n <= 2) { return 1; // 第一项和第二项都为1 } else { return fibonacci(n - 1) + fibonacci(n - 2); // 递归求解前两项之和 } } int main() { int n = 10; // 求斐波那契数列的第10项 printf("第%d项的值为%d\n", n, fibonacci(n)); return 0; } ``` 在上面的代码中,定义了一个名为`fibonacci`的递归函数。在函数中,首先判断`n`的值是否小于等于2,如果满足条件,则直接返回1;如果不满足,则通过递归的方式求解前两项的和。 在`main`函数中,定义了一个变量`n`,表示要求第几项的值。然后调用`fibonacci`函数,将结果打印输出。在本例中,求解的是斐波那契数列的第10项,所以输出结果为`第10项的值为55`。 以上就是使用C语言递归函数实现斐波那契数列,并且第一项和第二项都为1的代码示例。 ### 回答3: 用C语言编写斐波那契数列的递归函数,可以通过以下方式实现: ```c #include <stdio.h> int fibonacci(int n) { if (n == 1 || n == 2) { return 1; } else { return fibonacci(n - 1) + fibonacci(n - 2); } } int main() { int n; printf("请输入要计算的斐波那契数列项数:"); scanf("%d", &n); printf("斐波那契数列的第%d项为:%d\n", n, fibonacci(n)); return 0; } ``` 在上述代码中,定义了一个名为`fibonacci`的递归函数。若要计算斐波那契数列第`n`项的值,可以利用递归方式通过调用`fibonacci(n-1)`和`fibonacci(n-2)`的结果相加来实现。当`n`为1或2时,递归结束,返回1。 在`main`函数中,首先从用户处获取要计算的斐波那契数列的项数`n`,然后调用`fibonacci`函数计算第`n`项,并将结果打印在屏幕上。 以上就是用C语言递归函数写斐波那契数列第一二项都为1的代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值