(林大oj1276)

林大oj1276 感谢冯学长的指点

题目地址:https://acm.nefu.edu.cn/JudgeOnline/problemShow.php?problem_id=1276
本题思路是:先积分成等比数列,利用等比数列性质求和,再求导还原。
用到了 —— 费马小定理、快速幂、快速乘(防止直接乘爆longlong,用加代替乘,边加边取模)、大数字符读入处理、还有逆元。

经过积分 求和 再求导 得到为
(n-1)[(b+1)nb-(a+1)na]-(nb+1-na+1)
———————————————%mod
       (n-1)2

注意:(b+1) (a+1)需要对mod取模
而根据费马小定理nb na na+1 nb+1 中的a b需要对mod-1取模(巨坑 wrong了好几次)

#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <math.h>
#include <stdlib.h>
#include <string.h>
#define mod 10000000033
using namespace std;///
long long cheng(long long m,long long n)///暂且命名为快速乘模板(可以防止直接乘爆longlong)
{//对mod取模 
  m=m%mod;
  n=n%mod;
    long long b=0;
    while(n>0)
    {
        if(n&1)
            b=(b+m)%mod;
        n=n>>1;
        m=(m+m)%mod;
    }
    //printf("%lld\n",mod);
    return b;
}
long long cheng1(long long m,long long n)///暂且命名为快速乘模板(可以防止直接乘爆longlong)
{///对mod-1取模 —费马小定理  n^b^ n^a^ n^a+1^ n^b+1^  中的a b需要对mod-1取模
  m=m%(mod-1);
  n=n%(mod-1);
    long long b=0;
    while(n>0)
    {
        if(n&1)
            b=(b+m)%(mod-1);
        n=n>>1;
        m=(m+m)%(mod-1);
    }
    //printf("%lld\n",mod);
    return b;
}
long long quick(long long m,long long n)///快速幂
{

    long long b=1;
    while(n>0)
    {
        if(n&1)
            b=cheng(b,m)%mod;
        n=n>>1;
        m=(cheng(m,m))%mod;
    }
    //printf("%lld\n",mod);
    return b%mod;
}
char ax[25],bx[25];
int main()
{
     long long t,n,a1,a2,ans,x1,x2,x3,x4,x5;
     long long aa,aaa,bb,bbb,x,l1,l2,i;
     scanf("%lld",&t);
     while(t--)
     {
         scanf("%s%s%lld",ax,bx,&n);
        // printf("%s\n%s\n",ax,bx);
   l1=strlen(ax);
   l2=strlen(bx);
   aa=aaa=bbb=bb=0;
   for(i=0;i<l1;i++)
   {
       x=ax[i]-'0';
       aa=(aa*10+x)%(mod-1);//n^b^ n^a^ n^a+1^ n^b+1^  中的a b需要对mod-1取模
       aaa=(aaa*10+x)%mod;///(b+1) (a+1)需要对mod取模
   }
   for(i=0;i<l2;i++)
   {
       x=bx[i]-'0';
       bb=(bb*10+x)%(mod-1);//n^b^ n^a^ n^a+1^ n^b+1^  中的a b需要对mod-1取模
       bbb=(bbb*10+x)%mod;///(b+1) (a+1)需要对mod取模
   }
         n=n%mod;
         //printf("%lld  %lld\n",a,b);
         if(n==1)
         {
             x=quick(2,mod-2);///除于2    对2取逆元
             ans=cheng(aaa+1+bbb,bbb-aaa);
             ans=cheng(ans,x);
             printf("%lld\n",ans%mod);
              continue;
         }
           else
         {
             if(n==0)
             {
                printf("0\n");
                 continue;
             }
              else
         {
        a1=quick(n,aa)%mod;
        a2=quick(n,bb)%mod;
         //Ex_gcd(n-1,mod,x,y);
         x1=cheng(bbb+1,a2);
         x1=cheng(x1,n-1);
         x2=cheng(aaa+1,a1);
         x2=cheng(x2,n-1);
         x3=cheng(a2,n);
         x4=cheng(a1,n);
         x5=cheng(n-1,n-1);
         x5=quick(x5,mod-2);
        ans=(x1-x2+mod-x3+x4+mod)%mod;
        ans=cheng(ans,x5);
         printf("%lld\n",ans%mod);
            }
         }
     }
    return 0;
}

有问题可以评论区问我

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值