首页 > 试题广场 >

牛牛的函数2

[编程题]牛牛的函数2
  • 热度指数:711 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
定义函数 f(x) = (a+1)*x^a+(a+2)*x^(a+1)+...+b*x^(b-1),然后在给定a和b的情况下,求f(x)%10000000033的值。
示例1

输入

"1","3",2

输出

16

说明

f(2) = 2*2^1 + 3*2^2 = 16 

备注:
其中0<=n<=10^9,1<=a <= b-1<=10^20
#define lint __int128_t
const lint MOD = 10000000033;

class Solution {
public:
    lint quickMul(lint a, lint b) {
        return (a * b - (lint)((long double)a / MOD * b) * MOD + MOD) % MOD;
    }
    
    lint quickPow(lint a, lint b) {
        lint res = 1;
        while (b) {
            if (b & 1) res = quickMul(res, a);
            b >>= 1;
            a = quickMul(a, a);
        }
        return res;
    }
    
    lint stolint(string s) {
        lint res = 0, i = 1;
        for (int j = s.length() - 1; j >= 0; i *= 10, j--) res += i * (s[j] - '0');
        return res;
    }
    
    long long solve(string sa, string sb, int n) {
        if (n == 0) return 0;
        lint a = stolint(sa), b = stolint(sb);
        if (n == 1) return quickMul(quickMul(a + 1 + b, b - a), quickPow(2, MOD - 2));
        lint na = quickPow(n, a), nb = quickPow(n, b);
        lint c = (quickMul(quickMul(na, n), a) - quickMul(na, a + 1) + MOD) % MOD;
        lint d = (quickMul(quickMul(nb, n), b) - quickMul(nb, b + 1) + MOD) % MOD;
        return quickMul((d - c + MOD) % MOD, quickPow(n - 1, MOD - 3));
    }
};

发表于 2020-07-31 17:49:19 回复(0)

问题信息

难度:
1条回答 4407浏览

热门推荐

通过挑战的用户

查看代码