洛谷P3768 简单的数学题

解:
神奇的一批......参观yyb巨神的博客。
大致思路就是第一步枚举gcd,发现后面有个限制是gcd=1,用反演,得到的F(x)是两个等差数列求积。
然后发现有个地方我们除法的除数是乘积,于是换元枚举那个乘积。提到最前面。
稍微化一下,发现后面有个Id * miu,这个东西化成phi。
然后得到一个式子,前半部分是s2(n/i)这个整除分块,后面就要相应的求这个东西i2phi[i]的前缀和来迎合整除分块。
然后就是杜教筛,先设个g,把h(n)写出来发现要消掉一个d2,于是g(x) = x2。
没了。
#include <cstdio>
#include <map> typedef long long LL;
const int N = , T = ; LL MO; inline LL qpow(LL a, LL b) {
LL ans = ;
while(b) {
if(b & ) ans = ans * a % MO;
a = a * a % MO;
b = b >> ;
}
return ans;
} std::map<LL, LL> mp;
int p[N], top, phi[N];
LL F[N], inv2, inv6;
bool vis[N]; inline void getp(int n) {
phi[] = ;
for(int i = ; i <= n; i++) {
if(!vis[i]) {
p[++top] = i;
phi[i] = i - ;
}
for(int j = ; j <= top && i * p[j] <= n; j++) {
vis[i * p[j]] = ;
if(i % p[j] == ) {
phi[i * p[j]] = phi[i] * p[j];
break;
}
phi[i * p[j]] = phi[i] * (p[j] - );
}
}
for(int i = ; i <= n; i++) {
F[i] = (F[i - ] + (1ll * i * i % MO * phi[i] % MO)) % MO;
}
return;
} inline LL s2(LL x) { /// sum[1~n] ^ 2
x %= MO;
LL temp = (x + ) * x / % MO;
return temp * temp % MO;
} inline LL H(LL x) { /// sum of n^3
return s2(x);
} inline LL G(LL x) { /// sum of n^2
x %= MO;
return (x << | ) % MO * (x + ) % MO * x % MO * inv6 % MO;
} LL getF(LL x) {
if(x <= ) return ;
if(x <= T) return F[x];
if(mp.count(x)) return mp[x];
LL ans = H(x);
for(LL i = , j; i <= x; i = j + ) {
j = x / (x / i);
ans -= (G(j) - G(i - ) + MO) % MO * getF(x / i) % MO;
ans = (ans % MO + MO) % MO;
}
return mp[x] = ans;
} int main() {
LL n;
scanf("%lld%lld", &MO, &n);
getp(T);
inv6 = qpow(, MO - );
inv2 = (MO + ) / ; LL ans = ;
for(LL i = , j; i <= n; i = j + ) {
j = n / (n / i);
ans += s2(n / i) * (getF(j) - getF(i - ) + MO) % MO;
ans = (ans % MO + MO) % MO;
}
printf("%lld\n", ans);
return ;
}
AC代码
洛谷P3768 简单的数学题的更多相关文章
- 洛谷 P3768 简单的数学题 解题报告
P3768 简单的数学题 题目描述 由于出题人懒得写背景了,题目还是简单一点好. 输入一个整数\(n\)和一个整数\(p,\)你需要求出\((\sum_{i=1}^n\sum_{j=1}^n ijgc ...
- 【刷题】洛谷 P3768 简单的数学题
题目描述 由于出题人懒得写背景了,题目还是简单一点好. 输入一个整数n和一个整数p,你需要求出(\(\sum_{i=1}^n\sum_{j=1}^n ijgcd(i,j))~mod~p\),其中gcd ...
- 洛谷 - P3768 - 简单的数学题 - 欧拉函数 - 莫比乌斯反演
https://www.luogu.org/problemnew/show/P3768 \(F(n)=\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{n}ijgcd(i ...
- 洛谷 P3768 简单的数学题
https://www.luogu.org/problemnew/show/P3768 化简一下式子,就是$\sum_{d=1}^ncalc(d)d^2\varphi(d)$ 其中$calc(d)=\ ...
- 洛谷P3768 简单的数学题(莫比乌斯反演+狄利克雷卷积+杜教筛)
传送门 不会…… 两篇加在一起都看不懂…… https://www.cnblogs.com/cellular-automaton/p/8241128.html https://www.luogu.or ...
- 洛谷P3768 简单的数学题 【莫比乌斯反演 + 杜教筛】
题目描述 求 \[\sum\limits_{i=1}^{n} \sum\limits_{j=1}^{n} i*j*gcd(i,j) \pmod{p}\] \(n<=10^{10}\),\(p\) ...
- 洛谷P3768 简单的数学题 莫比乌斯反演+杜教筛
题意简述 求出这个式子 \[ \sum_{i=1}^n\sum_{j=1}^n ij(i,j) \bmod p \] 做法 先用莫比乌斯反演拆一下式子 \[ \begin{split} \sum_{i ...
- 洛谷 P3768 简单的数学题 (莫比乌斯反演)
题意:求$(\sum_{i=1}^{n}\sum_{j=1}^{n}ijgcd(i,j))mod p$(p为质数,n<=1e10) 很显然,推式子. $\sum_{i=1}^{n}\sum_{j ...
- 洛谷P3768 简单的数学题解题报告
$$\begin{eqnarray}&\sum_{i=1}^{n}\sum_{j=1}^{n}ij\gcd(i,j)\\&\sum_{d=1}^{n}\sum_{i=1}^{n}\su ...
随机推荐
- Dell BOSS 卡是什么
全名: Boot Optimized Storage Solution 针对 M.2 接口的 SSD,主板上必须设计接口进行适配. 设计一款主板对于硬件厂商来说是有成本的,其中包括 主板设计成本 产品 ...
- css3 动画效果实现
前沿 在工作中,经常有一些需要切换的交互样式.如果直接在两种状态之间切换,就显得有点生硬.加上一些动画效果就会好很多. 示例1:点击的三角切换 实现过程 第一步实现这个三角形 用的svg 的多边形画法 ...
- C. Vasya and Multisets
传送门 [http://codeforces.com/contest/1051/problem/C] 题意 给你一堆数,问是否可以分为两堆使得两堆里只出现一下的数字的种类相等,可以输出任意一种分的方式 ...
- 12.11 Daily Scrum
Today's Task Tomorrow's Task 丁辛 实现和菜谱相关的餐厅列表. 实现和菜谱相关的餐厅列表. 邓亚梅 美化搜索框UI. 美 ...
- app推广及主要代码
app推广: 一.基本情况 我们把推广和调研都放在了一起,主要是调研,主要通过调查问卷和直接访问的方式,让调查的人能够看到我们app的主要功能, 然后做出评价和对此改善的意见.调 ...
- .NET 使用 RabbitMQ 图文简介
前言 最近项目要使用RabbitMQ,园里里面已经有很多优秀的文章,Rabbitmq官网也有.net实例.这里我尝试下图文并茂之形式记录下使用的过程. 安装 RabbitMQ是建立在erlang OT ...
- 现代程序设计 homework-01
搞了6个小时individual project...看看博客做一做第一次现代程序设计作业 1) 建立 GitHub 账户, 把课上做的 “最大子数组之和” 程序签入 我的github地址是https ...
- 业务-----修改Service常用逻辑
注意:修改时唯一属性不能重复 //num==null 时,没有修改Num,不用考虑重复问题.//num!=null 时,修改了num.考虑重复问题 if(!StringUtils.isEmpty(re ...
- Spring Cloud的Zuul的使用问题
Zuul Client 放在移动App中,Zuul Server可以做集群. Zuul Client放在jar包吗?ios怎么办? Zuul与Spring Security配合使用,与Shiro做集成 ...
- Java Date Compare
Date a;Date b;假设现在你已经实例化了a和ba.after(b)返回一个boolean,如果a的时间在b之后(不包括等于)返回true b.before(a)返回一个boolean,如果b ...