@Chilling
2016-08-11T15:51:02.000000Z
字数 1537
阅读 877
数论
Description
Consider a linear function . Let's define and for . For the given integer values and find the value of modulo .
Input
The only line contains four integers and — the parameters from the problem statement.
Note that the given value n can be too large, so you should use 64-bit integer type to store it. In C++ you can use the long long integer type and in Java you can use long integer type.
Output
Print the only integer s — the value modulo .
Input
3 4 1 1
3 4 2 1
3 4 3 1
Output
7
25
79
题意:, , ,给出A,B,n和x,求 模 的值。
分析:把,,……写出来之后发现:
……
得到:
因此后面一部分为等比数列,可以用等比数列求和公式求值,公比为 A
可以看出,A 不能为1,所以要特判A为1时的情况
时,又因为要模,等比公式求和的时候出现了分数,因此我们用到费马小定理,
即为关于模mod的乘法逆元,就将除法转化为了乘法。
#include<stdio.h>
#define LL long long
const LL MOD=1e9+7;
LL quick(LL x,LL m,LL n)
{
LL ans=1;
while(m>0)
{
if(m%2==1)
ans=ans*x%n;
x=x*x%n;
m=m/2;
}
return ans;
}
int main()
{
LL a,b,n,x,s,ss,sss;
LL zuo,you;
while(scanf("%lld%lld%lld%lld",&a,&b,&n,&x)!=EOF)
{
if(a==1) //特判a为1的时候
sss=(x%MOD+((b%MOD)*(n%MOD))%MOD)%MOD;
else
{
s=quick(a,n,MOD); //a^n
zuo=(s*x%MOD)%MOD; //x*a^n; //非等比数列部分
ss=quick(a-1,MOD-2,MOD); //求a-1关于mod的乘法逆元
you=(s-1%MOD+MOD)%MOD; //a^n -1 %MOD 分子部分
you=you*ss%MOD*b%MOD;
sss=(zuo+you)%MOD;
}
printf("%lld\n",sss);
}
return 0;
}