题目链接:点击查看

题目大意:给出公式,其中,则,现在给出n(<=1e12),求出答案对998244353取模后的答案

题目分析:若用暴力实现上述公式,只需要两层for循环,时间复杂度为n*n,也就是1e24。。所以我们需要想办法优化,其实上面的公式看着吓人,我们稍微化简一下:

这样看起来就亲切多了,再其实仔细观察一下就会发现,因为第二层循环的b是从a开始的,所以一定是大于零并且小于等于1,这样向上取整就变为1了,乘上1就可以直接约分了:

这样一来这个公式就比较好想了,因为n给的是1e12,这个数字很容易让人联想到sqrt(n),也就是1e6,所以我们不妨分一下块,对第一层的a简单分为[1,sqrt(n)]+[sqrt(n)+1,n],因为上面公式的b最大为1e12,所以只要a大于1e6,那么向下取整答案就是1了,也就是说对于[sqrt(n)+1,n]这一部分,我们可以稍微化简一下:

现在利用等差数列求和公式以及平方和求和公式,就可以O(1)计算出区间[sqrt(n)+1,n]之间的答案了

而对于区间[1,sqrt(n)]中的答案,我们可以直接O(n)跑了,对于其中第二层循环b,虽然看着是要从a跑到1e12,但其实稍微思考一下就能发现,因为是要求的值作为答案,而这个值向下取整后,在a确定的情况下,的值在一段连续的区间上肯定是相同的,根据这个性质我们可以将1e12的数据分块,分为一段一段的,每一段上的答案都为一个值,这样分块后我们就能很快的算出答案了,这个分块最大是当a以2为底时,也就才40最大了,时间复杂度可以大胆地放缩,因为最大也就才1e6*40,5e7左右,在评测机上的表现还是十分优秀的

话说回来,我们该怎么求这个区间呢,其实稍微将上面的式子转换一下:

等价于

所以我们可以从1开始枚举x,从而计算出b的区间在内的都等于x,既然都是一个常数了,那么我们直接根据公式就能直接计算贡献了,前面的公式也就是a*x*区间长度

最后需要注意一下关于取模时的一个巨坑,也就是遇到n就要模一下,不然1e12*1e9直接就把longlong爆掉了,还有就是在计算的过程中可能会出现负数,所以最后需要先模再加模最后再取模,基操基操

还有就是在计算等差数列求和公式和平方和求和公式时,会遇到除法,这个时候直接用费马小定理求一下逆元就可以解决了

代码:

#include<iostream>
#include<cstdlib>
#include<string>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<climits>
#include<cmath>
#include<cctype>
#include<stack>
#include<queue>
#include<list>
#include<vector>
#include<set>
#include<map>
#include<sstream>
#include<unordered_map>
using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=1e3+100;const int mod=998244353;LL inv2,inv6;//2的逆元和6的逆元LL q_pow(LL a,LL b)
{LL ans=1;while(b){if(b&1)ans=ans*a%mod;a=a*a%mod;b>>=1;}return ans;
}LL get_ans1(LL n)//1~a的等差和
{return (n%mod)*((n+1)%mod)%mod*inv2%mod;
}LL get_ans2(LL n)//1~a*a的平方和
{return (n%mod)*((n+1)%mod)%mod*(2*n%mod+1)%mod*inv6%mod;
}int main()
{
//  freopen("input.txt","r",stdin);
//  ios::sync_with_stdio(false);inv2=q_pow(2,mod-2);inv6=q_pow(6,mod-2);LL n;cin>>n;LL t=sqrt(n);LL ans=(((n+1)%mod)*(get_ans1(n)-get_ans1(t))%mod-get_ans2(n)+get_ans2(t))%mod;for(LL a=2;a<=t;a++){LL x=1;//记录loga(b)的值,即b=a^xLL b=a;LL sum=0;while(b<=n){sum=(sum+(min(b*a-1,n)-b+1)%mod*x%mod)%mod;b*=a;x++;}ans=(ans+sum*a%mod)%mod;}cout<<(ans%mod+mod)%mod<<endl;return 0;
}

2019ICPC(银川) - Function!(数论+数学分块)相关推荐

  1. 亿些模板【数论数学】

    文章目录 前言 数论数学模板 GCD exgcd 快速幂 线性推逆元 线性推逆元(非连续) 逆元求组合数 矩阵乘法 线性筛素数-埃氏筛 线性筛素数-线性筛 线性筛欧拉-埃氏筛 线性求欧拉 龟速乘 FF ...

  2. 2019ICPC银川 F.Function!(数学)

    题意: 解法: f a ( x ) 的 逆 函 数 是 l o g a b a n s = ∑ a = 2 n ( a ∑ b = a n ⌊ f a − 1 ( b ) ⌋ ⌈ f b − 1 ( ...

  3. lightoj 1098 A New Function 约数之和(一道奇怪的数论) 整除分块优化

    文章目录 题目如下: 思考人生: 题目如下: lightoj 1098 A New Function 求1-n所有数的所有约数之和(不包括1和它本身).n<=2e9. 思考人生: 首先考虑打表找 ...

  4. 2019ICPC(银川) - Delivery Route(强连通缩点+分块最短路)

    题目链接:点击查看 题目大意:给出n个点和m条边构成的图,每条边都有权值,其中m1条边是双向的,且权值非负,有m2条边是单向的,且权值可负,现在要求从给定起点st到其他每个点的最短路,若不存在路径则输 ...

  5. 数论只会 for 循环 (数学+分块+记忆化)

    目链接:点击这里 题目大意: 给定 n , k n,kn,k 计算函数: f ( n , k ) = { 1 i f k = 0 ∑ i = 1 n ⌈ l o g 2 i ⌉ f ( ⌊ n i ⌋ ...

  6. matlab编写数学公式计算,关于MATLAB Function实现数学运算的相关介绍

    描述 其实也就是使用 Simulink 库里相应的模块,以及使用 Stateflow 流程图向导.在这一篇,我们介绍使用MATLAB Function的方式. 其实,如果想在 Simulink 里嵌套 ...

  7. noip2017考前基础复习——数论数学

    ·最大公约数 gcd 辗转相除法  gcd(a,b)=gcd(b,a%b) 1 int gcd(int x,int y){ 2 if(y==0) return x; 3 return gcd(y,x% ...

  8. 2021牛客暑期多校训练营1 H-Hash Function(数学+FFT)

    H-Hash Function Shining_xzl大佬题解 本题答案符合题意的充分必要条件是:不能是任意两个数的差以及他们的因数,因此只需用用FFT求出这些数的差,记为差的集合. 从小到大考虑一个 ...

  9. 模板 - 数论 - 整除分块

    //整除分块,n版 ll aliquot_patition(int n) {ll ans=0;for(int l=1,r; l<=n; l=r+1) {r=n/(n/l);ans+=1ll*(n ...

最新文章

  1. error:CLEARTEXT communication to api.help.bj.cn not permitted by network security policy
  2. NSURLRequest的超时陷阱
  3. DeepMind用ReinforcementLearning玩游戏
  4. SAP云平台上两个ABAP系统实例之间的互连
  5. 一款好的折线图、饼图、柱形图
  6. 红帽linux5安装Oracle 9i enterprise
  7. 华为荣耀畅玩7c计算机在那,华为荣耀畅玩7C内存多大
  8. 国产毫米波雷达领域的领头羊,木牛科技将在明年量产77GHz汽车雷达
  9. jQuery中的ajax、jquery中ajax全局事件、load实现页面无刷新局部加载、ajax跨域请求jsonp、利用formData对象向服务端异步发送二进制数据,表单序列化(异步获取表单内容)
  10. 多看看飞鸽传书等系统级的源代码
  11. Spring Boot笔记-echarts的使用及数据的修改
  12. Java代理模式概述及应用场景
  13. 微信公众号怎么赚钱?
  14. ThreeJs 数据可视化学习扫盲
  15. 模拟电子技术之运算放大器
  16. MSE、RMSE、MAE、R方等指标整理
  17. truelicense使用手册
  18. [转] 最火的42部美剧,练听力的不二之选
  19. 用Django加PIL做一个证件照模板生成器网页
  20. 查看linux下oracle安装位置

热门文章

  1. springboot日志的级别
  2. MySQL分组函数和distinct搭配使用
  3. MySQL高级show profile
  4. AIO(Asynchronous IO)基本原理
  5. 角色操作-角色添加代码实现
  6. 字符输出流的续写和换行
  7. SpringBoot https访问控制
  8. 借用构造函数 组合继承 拷贝继承 总结继承
  9. C++用模板元编程进行循环展开的性能测试
  10. MySQL授权用户及密码恢复设置