牛牛的函数
定义函数 f(x) = x^a + x^(a+1) +…+ x^(b-1) + x^b,然后在给定a和b的情况下,求f(x)%10000000033的值。
示例
输入
1,3,2
输出
14
说明
f(2) = 2^1 + 2^2 + 2^3 = 14
备注
其中0<=x,a,b<=1e9, 且 a<=b
解
f(n) = na + na+1 + … + nb-1 + nb
nf(n) = na+1 + na+2 + … + nb + nb+1
nf(n) - f(n) = nb+1 - na
f(n) = (nb+1 - na) / (n - 1)
由于测试数据大,用快速幂运算、快速乘法、逆元进行优化
由费马小定理知,k的逆元等于 kmod-2(当k和mod互质)
参考【同余定理+逆元】知识点讲解
#define mod 10000000033
typedef long long LL
//快速乘法
LL quick_mul(LL n, LL m)
{
n %= mod;
m %= mod;
LL res = 0;
while(m)
{
if(m & 1)
{
res += n;
if(res >= mod)
res -= mod;
}
m >>= 1;
n <<= 1;
if(n >= mod)
n -= mod;
}
return res;
}
//快速幂运算
LL quick_pow(LL n, LL m)
{
LL res = 1;
while(m)
{
if(m & 1)
{
res = quick_mul(res, n);
}
m >>= 1;
n = quick_mul(n, n);
}
return res;
}
//解
LL solve(int a, int b, int n) {
// write code here
if(n == 0) return 0;
if(n == 1) return b-a+1;
LL res = (quick_pow(n, b+1) - quick_pow(n, a) + mod) % mod;
//计算n-1的逆元
LL inv = quick_pow(n-1, mod - 2);
return quick_mul(res, inv);
}