Function!(2019银川F题)

链接:https://nanti.jisuanke.com/t/42386
公式化简:图片说明

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod = 998244353;
int inv2, inv6;
int ans;
int b;
ll n;

int ksm(int a, int b)
{
    int ret = 1;
    for(; b; b >>= 1, a = 1LL * a * a % mod)
    {
        if(b & 1) ret = 1LL * ret * a % mod;
    }
    return ret;
}
int ni(int a)
{
    return ksm(a, mod - 2);
}
void init()
{
    int tmp1 = (n+1) % mod, tmp2 = (n+b+1) % mod, tmp3 = (n-b+mod) % mod;
    int tmp4 = n % mod, tmp5 = (n+1) % mod, tmp6 = (2*n+1) % mod;
    ans = 1LL * tmp1 * tmp2 % mod * tmp3 % mod * inv2 % mod;
    (ans += 1LL * b * (b+1) % mod * (2*b+1) % mod * inv6 % mod) %= mod;
    (ans += mod - 1LL * tmp4 * tmp5 % mod * tmp6 % mod * inv6 % mod) %= mod;
}
void work()
{
    for(int i = 2; i <= b; i++)
    {
        int k = 1; ll tmp = i;
        while(tmp < n)
        {
            tmp *= i;
            k++;
        }
        if(tmp > n) k--;
        int tmp1 = (n+1) % mod * k % mod;
        int tmp2 = 1LL * i * (ksm(i, k) - 1 + mod) % mod * ni(i-1) % mod;
        (ans += 1LL * (tmp1 - tmp2 + mod) * i % mod) %= mod;
    }
}
int main()
{
    inv2 = ni(2); inv6 = ni(6);
    scanf("%lld", &n);
    if(n == 2) {printf("2\n"); return 0;}
    if(n == 3) {printf("7\n"); return 0;}
    b = sqrt(n);
    init();
    work();
    printf("%d\n", ans);

    return 0;
}
全部评论

相关推荐

不知道怎么取名字_:两个方向 1.简历针对性准备下 2.面试前也需要准备的 主要还是要看各个公司需求,看公司行业和岗位描述,那里面已经写了对技术的需求,一份简历,不可能和所有嵌入式岗位都匹配的
投递北京经纬恒润科技股份有限公司等公司6个岗位
点赞 评论 收藏
分享
10-29 15:51
嘉应学院 Java
后端转测开第一人:你把简历的学历改成北京交通大学 去海投1000份发现基本还是没面试
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务