hdu 6050 Funny Function

本文解析了HDU6050题目,介绍了如何通过递推公式找到规律,并利用快速幂和逆元解决大数运算及取余问题。文章提供了完整的C++代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

hdu 6050 Funny Function
这里写图片描述
根据题目所给的递推公式我们可以打表出n=10以内的数据,寻找规律,当然对于这种给了你递推公式,我们可以利用Excel表格来找规律,这个题最后的规律:
这里写图片描述
因为题上给的数据比较大,所以这里我们算整数幂的时候要用整数快速幂,还有个知识点就是这里牵涉到一个对一个除数取余的事情,这里要用到逆元+费马小定理
费马小定理: 假如p是质数,且gcd(a,p)=1,那么 a^(p-1)≡1(mod p),即:假如a是整数,p是质数,且a,p互质(即两者只有一个公约数1),那么a的(p-1)次方除以p的余数恒等于1。
逆元:a*(a^-1)= 1= 1%p;
费马小定理:a^(p-1)=1% p;
两式结合:(a^-1) = a^(p-2);
code

#include <bits/stdc++.h>
//#define mod 1e9+7
typedef long long LL;
const LL mod = 1e9+7;
using namespace std;
LL n,m,ans,res;
LL Mult(LL x,LL N)
{
    ans = 1;
    res = x;
    while(N){
       if(N&1)
        ans = res*ans%mod;
      res = res*res%mod;
     N>>=1;
    }
    return ans;
}
LL inv(LL x){
    return Mult(x,mod-2);
}
int main()
{
    int T;scanf("%d",&T);
    while(T--)
    {
        LL anss;
        scanf("%lld %lld",&n,&m);
        if(n%2==0){
            anss = (Mult((Mult(2,n)-1),m-1)%mod*2)*inv(3)%mod;
        }
        else{
            anss = (Mult((Mult(2,n)-1),m-1)*2%mod+1)*inv(3)%mod;
        }
        printf("%lld\n",anss);
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值