https://www.luogu.org/problemnew/show/P3768

化简一下式子,就是$\sum_{d=1}^ncalc(d)d^2\varphi(d)$

其中$calc(d)=\frac{({\lfloor}\frac{n}{d}{\rfloor}+1)^2{{\lfloor}\frac{n}{d}{\rfloor}}^2}{4}$

可以对calc(d)做整除分块,那么要求$d^2\varphi(d)$的前缀和

看一眼数据范围,大概要杜教筛

凑了一会,发现令$f(d)=d^2\varphi(d)$,$g(d)=d^2$,$h=f*g$,那么$h(n)=n^2\sum_{d|n}\varphi(d)=n^3$

(也就是说$id^3=id^2\varphi*id^2$,好神奇啊)

那么就好办了,$n^3$的前缀和是有公式的($1^3+2^3+..+n^3=(1+2+..+n)^2$)

杜教筛那个式子套一下就行了。。也可以预处理一点前缀和

复杂度?...不会算

以下是瞎扯:

设预处理1-K

算一次x,复杂度是$f(x)=\sum_{i=1}^{x/K}\sqrt{\frac{x}{i}}=O(\frac{x}{\sqrt{K}})$

后半部分复杂度是$\sum_{i=1}^{n/K}f(\frac{n}{i})=nK^{-\frac{1}{2}}\sum_{i=1}^{n/K}\frac{1}{i}=nK^{-\frac{1}{2}}log(n/K)$

总复杂度是$nK^{-\frac{1}{2}}log(n/K)+K$

当$K=n^{\frac{2}{3}}$时,复杂度是$n^{\frac{2}{3}}log$

 #include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
#include<map>
using namespace std;
#define fi first
#define se second
#define mp make_pair
#define pb push_back
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
ll md;
ll H(ll n)
{
__int128 t=__int128(n+)*n/%md;
return t*t%md;
}
ll G(ll n)
{
return __int128(n)*(n+)*(*n+)/%md;
}
ll Mod(ll n,ll d=md)
{
if(n>=) return n%d;
else if(n%d==) return ;
else return d+n%d;
}
const ll K=;
ll HH[K+],prime[K+],len;
bool nprime[K+];
map<ll,ll> ma;
ll calc(ll n)
{
if(n<=K) return HH[n];
if(ma.count(n)) return ma[n];
ll i,j,ans=H(n);
for(i=;i<=n;i=j+)
{
j=n/(n/i);
ans=Mod(ans-Mod(G(j)-G(i-))*calc(n/i)%md);
}
return ma[n]=ans;
}
ll n;
ll X(ll d)
{
__int128 t=__int128(n/d+)*(n/d)/%md;
return t*t%md;
}
ll ans;
int main()
{
ll i,j;
//md=1000000007;
scanf("%lld%lld",&md,&n);
HH[]=;
for(i=;i<=K;i++)
{
if(!nprime[i]) {prime[++len]=i;HH[i]=i-;}
for(j=;j<=len&&i*prime[j]<=K;j++)
{
nprime[i*prime[j]]=;
if(i%prime[j]==)
{
HH[i*prime[j]]=HH[i]*prime[j];
break;
}
else
HH[i*prime[j]]=HH[i]*(prime[j]-);
}
}
for(i=;i<=K;i++) HH[i]=HH[i]*i%md*i%md;
for(i=;i<=K;i++) HH[i]=(HH[i-]+HH[i])%md;
// while(1)
// {
// scanf("%lld",&n);
// printf("%lld\n",calc(n));
// }
for(i=;i<=n;i=j+)
{
j=n/(n/i);
ans=(ans+X(i)*Mod(calc(j)-calc(i-))%md)%md;
}
printf("%lld",ans);
return ;
}

洛谷 P3768 简单的数学题的更多相关文章

  1. 洛谷 P3768 简单的数学题 解题报告

    P3768 简单的数学题 题目描述 由于出题人懒得写背景了,题目还是简单一点好. 输入一个整数\(n\)和一个整数\(p,\)你需要求出\((\sum_{i=1}^n\sum_{j=1}^n ijgc ...

  2. 【刷题】洛谷 P3768 简单的数学题

    题目描述 由于出题人懒得写背景了,题目还是简单一点好. 输入一个整数n和一个整数p,你需要求出(\(\sum_{i=1}^n\sum_{j=1}^n ijgcd(i,j))~mod~p\),其中gcd ...

  3. 洛谷 - P3768 - 简单的数学题 - 欧拉函数 - 莫比乌斯反演

    https://www.luogu.org/problemnew/show/P3768 \(F(n)=\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{n}ijgcd(i ...

  4. 洛谷P3768 简单的数学题

    解: 神奇的一批......参观yyb巨神的博客. 大致思路就是第一步枚举gcd,发现后面有个限制是gcd=1,用反演,得到的F(x)是两个等差数列求积. 然后发现有个地方我们除法的除数是乘积,于是换 ...

  5. 洛谷P3768 简单的数学题(莫比乌斯反演+狄利克雷卷积+杜教筛)

    传送门 不会…… 两篇加在一起都看不懂…… https://www.cnblogs.com/cellular-automaton/p/8241128.html https://www.luogu.or ...

  6. 洛谷P3768 简单的数学题 【莫比乌斯反演 + 杜教筛】

    题目描述 求 \[\sum\limits_{i=1}^{n} \sum\limits_{j=1}^{n} i*j*gcd(i,j) \pmod{p}\] \(n<=10^{10}\),\(p\) ...

  7. 洛谷P3768 简单的数学题 莫比乌斯反演+杜教筛

    题意简述 求出这个式子 \[ \sum_{i=1}^n\sum_{j=1}^n ij(i,j) \bmod p \] 做法 先用莫比乌斯反演拆一下式子 \[ \begin{split} \sum_{i ...

  8. 洛谷 P3768 简单的数学题 (莫比乌斯反演)

    题意:求$(\sum_{i=1}^{n}\sum_{j=1}^{n}ijgcd(i,j))mod p$(p为质数,n<=1e10) 很显然,推式子. $\sum_{i=1}^{n}\sum_{j ...

  9. 洛谷P3768 简单的数学题解题报告

    $$\begin{eqnarray}&\sum_{i=1}^{n}\sum_{j=1}^{n}ij\gcd(i,j)\\&\sum_{d=1}^{n}\sum_{i=1}^{n}\su ...

随机推荐

  1. linux 标准i2c接口(一)

    一:I2C设备操作方式: 1.  应用程序操作法:i2c的设备的驱动可以直接利用linux内核提供的i2c-dev.c文件提供的ioctl函数接口在应用层实现对i2c设备的读写,但是在应用层使用ioc ...

  2. appium安装报错但运行成功

    npm install -g  appium ERR! fetch failed https://registry.npmjs.org/appium-uiauto/-/appium-uiauto-1. ...

  3. VUE 之 JS指令

    1.v-text的用法: 2.v-html 3.v-for 4.v-if , v-else if ,v-else v-if 每次生成都只有一个标签,即符合条件的标签. 5.v-show v-show ...

  4. UVA - 11019 Matrix Matcher hash+KMP

    题目链接:传送门 题解: 枚举每一行,每一行当中连续的y个我们hash 出来 那么一行就是 m - y + 1个hash值,形成的一个新 矩阵 大小是 n*(m - y + 1), 我们要找到x*y这 ...

  5. bash shell和进程

    1 exec builtin 不创建子shell,在原进程的上启动新的脚本,但是它会把老shell的环境清理掉,所以,它从原shell中什么也不继承,在一个干净的环境中执行新的脚本.执行完之后退出当前 ...

  6. CentOS 6.5 通过 PHP函数的sendmail 发送邮件

    非常多站点须要用到Sendmail函数发送激活邮件,在centos中内置了Sendmail模块,直接调用就可以,假设遇到问题,可採用例如以下两个步骤检測并解决: 1. 命令行输入:echo " ...

  7. C# 事件处理与自定义事件

    http://blog.csdn.net/cyp403/article/details/1514023 图一                                               ...

  8. CodeForces985F:Isomorphic Strings (字符串&hash)

    题意:取出字符串Str里的两个串S,T,问对应位置的的字符在否有一一映射关系. hash:对于每个字符s=‘a’-‘z’,我们任意找一个i,满足Si==s,(代码里用lower_bound在区间找到最 ...

  9. [Java] 继承,隐藏,覆盖,重载,多态,抽象类,接口

    1.子类 class SonClass extends ABC{...} 在子类定义后,子类中就可以直接隐式包含父类的成员变量和方法,而不用再写,这就是使用继承的优点. 子类包含父类的成员,不是子类和 ...

  10. 【SCOI 2009】 Windy数

    [题目链接] 点击打开链接 [算法] 数位DP,注意处理前导零的情况 [代码] #include<bits/stdc++.h> using namespace std; #define M ...