洛谷月赛P3768 简单的数学题
2017-05-08 21:56
211 查看
简述
这是道比较有意思的题。首先用莫比乌斯反演推出答案:
令g(x)=(x(x+1)2)2
ans=∑x=1nx2g(⌊nx⌋)∑d|xdμ(xd)
后面那个卷积直接线性筛,然后直接做是O(n)的,能过60分。良心出题人部分分给的好足啊。
注意到一个事情,前面的那个g(⌊nx⌋)的取值是根号的,因此继续化下式子。
ans=∑x=1ng(⌊nx⌋)x2∑d|xdμ(xd)
令f(x)=x2∑d|xdμ(xd)
显然我们要预处理这个东西的前缀和才能做这道题,而且肯定是需要低于线性的算法(那就很可能是杜教筛了)。
这个东西很难看出什么门道,我们显然需要用狄利克雷卷积的运算律给他化简下。
令h(i)=i
f(x)=x2(h∗μ)(x)
为了好看先把x2拿掉,我们看到里面有个μ,于是非常好奇地卷个1
h∗μ∗1=h∗(μ∗1)=h∗ϵ=h
咦?
也就是说(h∗μ)∗1=h
这不就是φ吗,φ∗1=h啊
太神奇了(是我知道的太少了)
所以f(x)=x2φ(x)
这个东西怎么杜教筛啊,卷啥呀
冥思苦想了半天,还是搞出来了,令h2(x)=x2
那么(f∗h2)(x)=∑d|xf(x)h2(xd)=∑d|xd2φ(d)x2d2=x2∑d|xφ(x)=x3
这样一个优美的结论着实令我惊讶。 ————引用自pty
令s(n)=∑ni=1f(x)
则h2(1)s(n)=∑i=1n(f∗h2)(i)−∑i=2nh2(i)s(⌊ni⌋)s(n)=∑i=1ni3−∑i=2nh2(i)s(⌊ni⌋)
然后你就不能挡我用杜教筛了。
你问我复杂度?
大概O(N12×N12×23)=O(N56)
确实比较玄学。
代码
#include <cstdio> #include <algorithm> #define maxn 4700000 #define ll long long using namespace std; ll N, p, prime[maxn], phi[maxn], f[maxn], s2[maxn], inv; bool mark[maxn]; inline ll pow(ll a, ll b, ll p) { ll ans=1, t=a; for(;b;b>>=1,t=t*t%p)if(b&1)ans=ans*t%p; return ans; } inline ll sqr(ll x){x%=p;return x*x%p;} inline ll g(ll x){x%=p;return sqr((x*(1+x)>>1)%p);} inline ll gets2(ll x) { if(x<maxn)return s2[x]; x%=p; return x*(x+1)%p*(2*x+1)%p*inv%p; } void init() { ll i, j, d, x; phi[1]=1; for(i=2;i<maxn;i++) { if(!mark[i])prime[++*prime]=i, phi[i]=i-1; for(j=1;i*prime[j]<maxn;j++) { mark[i*prime[j]]=1; if(i%prime[j]==0){phi[i*prime[j]]=phi[i]*prime[j]%p;break;} phi[i*prime[j]]=phi[i]*phi[prime[j]]%p; } } for(i=1;i<maxn;i++)phi[i]=(phi[i]*sqr(i)%p+phi[i-1])%p; for(i=1;i<maxn;i++)s2[i]=(s2[i-1]+i*i)%p; } ll getf(ll n){return n<maxn?phi :f[N/n];} void calc(ll n) { if(!n)return; ll i, last, t=N/n; if(n<maxn or f[t])return; f[t]=g(n); for(i=2;i<=n;i=last+1) { last=n/(n/i); calc(n/i); f[t]=(f[t]-(gets2(last)-gets2(i-1))*getf(n/i)%p)%p; } } void solve() { ll ans=0, i, last, t; for(i=1;i<=N;i=last+1) { last=N/(N/i); calc(last); calc(i-1); ans=(ans+g(N/i)%p*((getf(last)-getf(i-1))%p)%p)%p; } printf("%lld",(ans+p)%p); } int main() { ll ans=0, x; scanf("%lld%lld",&p,&N); inv=pow(6,p-2,p); init(); solve(); return 0; }
相关文章推荐
- 洛谷 1029——最大公约数和最小公倍数问题(简单的数学问题)
- 牛客小白月赛1 A 简单题 【数学】
- 洛谷 1403——[AHOI2005]约数研究(简单数学问题)
- 牛客小白月赛1 B 简单题2 【数学】
- 洛谷3678:简单的数学题(画柿子+杜教筛)
- 洛谷 1147——连续自然数和(简单数学问题)
- "简单"的数学问题 洛谷 P1414 又是毕业季II
- 数学之美系列五 -- 简单之美:布尔代数和搜索引擎的索引
- 数学之美系列五 -- 简单之美:布尔代数和搜索引擎的索引
- 简单的小学数学题
- 数学之美系列五 之 简单之美:布尔代数和搜索引擎的索引
- 数学之美系列五 -- 简单之美:布尔代数和搜索引擎的索引
- 数学之美系列五 -- 简单之美:布尔代数和搜索引擎的索引
- 征税到底亏了谁?简单数学背后的经济学原理
- 数学之美 系列五 – 简单之美:布尔代数和搜索引擎的索引
- 一个计算简单数学表达式值的算法。
- 简单语法分析-数学表达式
- 简单一道数学题 剿灭100%垃圾邮件
- 有一道十分简单的数学题,但是我就是没想出来,不得以发在首页求助
- 数学之美系列之五:简单之美--布尔代数和搜索引擎的索引