林大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;
}
有问题可以评论区问我