Lucas的数论题解
Lucas的数论
reference
Pre
数论分块
默认向下取整时.
形如\(\sum\limits_{i=1}^n f\left( \frac{n}{i}\right)\)的求和,由于\(\frac{n}{r}\)的值只有\(\sqrt{n}\)个,可以直接数论分块上.
题解
记原式为\(S(n)\),有
\]
\]
记
\]
则
\]
那么
\]
可以直接上数论分块.
那么$$S(n)$$也可以数论分块球了> <...
然后\(\mu\)函数的前缀和...就这样:
然后发现也可以数论分块+记忆化搜索搞一搞.
然后就莫名其妙地过了> <
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <iostream>
#include <ext/rope>
#include <ext/pb_ds/tree_policy.hpp>
#include <ext/pb_ds/priority_queue.hpp>
#define fon(i,n) for(int i=0;i<n;++i)
#define fonx(i,f,n,s) for(int i=f;i<n;i+=s)
#define fonu(i,n) for(int i=1;i<n;i<<=1)
#define fong(i,s,n) for(int i=s;i<=n;++i)
#define debug true
#define pi 3.14159265358979323846264
#define mod 1000000007
typedef long long ll;
typedef unsigned long long ull;
struct __sieve{
int primes[1000000],primelen,spf[5000000+1],lm[5000000+1];
bool isk[5000000+1];
int lmer[5000000+1];
void operator()(){
lmer[1]=lm[1]=1;
fong(i,2,5000000){
if(!isk[i]) lm[i]=-1,primes[primelen++]=i;
fon(j,primelen){
int k=i*primes[j];
if(k>5000000) break;
isk[k]=1;
if(i%primes[j]) lm[k]=-lm[i]; else {
lm[k]=0;
break;
}
}
lmer[i]=lmer[i-1]+lm[i];
}
}
inline int operator[](int a){return lmer[a];}
} linear_sieve;
struct __hash{
#define hashmod 3001001
inline int hash(int n){
return ((n*405347)&1073741823)%hashmod;
}
int n[hashmod][3],h[hashmod],len;
inline int find(int N){
int p=hash(N);
int q=h[p];
while(p&&n[p][0]!=N) p=n[p][2];
return p?n[p][1]:-1;
}
inline void ins(int N,int p){
++len;
int q=hash(N);
n[len][0]=N,n[len][1]=p,n[len][2]=h[q],h[q]=len;
}
} hashmap;
int N,n;
int sumMiu(int a){
if(a<=5000000) return linear_sieve[a];
int res=hashmap.find(a);
if(~res) return res;
int t=1;
for (int l = 1, r = 2,n=a; r <= n; r ++){
r = std::min(n, n / (n / r));
int tmp = n / r;
t-=(r-l+mod)%mod*sumMiu(tmp)%mod;
t=(r<0)?t+mod:t;
l = r;
}
hashmap.ins(a,t);
return t;
}
int F(int n){
int ans = 0;
for (int l = 0, r = 1; r <= n; r ++){
r = std::min(n, n / (n / r));
int res = (n / r) % mod;
int tmp = (r - l + mod) % mod * res % mod;
ans += tmp;
if (ans >= mod) ans -= mod;
l = r;
}
return ans;
}
int main(){
#ifdef debug
freopen("mathP.in","r",stdin);
freopen("mathP.out","w",stdout);
#endif
scanf("%d",&n);
N=(int)pow((double)n,.5);
linear_sieve();
int ans=0;
for (int l = 0, r = 1; r <= n; r ++){
r = std::min(n, n / (n / r));
int res=F(n/r);
ans+=((ll)sumMiu(r)-sumMiu(l)+mod)%mod*res%mod*res%mod;
if(ans>=mod) ans-=mod;
l = r;
}
printf("%d\n",ans);
return 0;
}
Lucas的数论题解的更多相关文章
- bzoj 4176: Lucas的数论 -- 杜教筛,莫比乌斯反演
4176: Lucas的数论 Time Limit: 30 Sec Memory Limit: 256 MB Description 去年的Lucas非常喜欢数论题,但是一年以后的Lucas却不那么 ...
- 【BZOJ4176】Lucas的数论 莫比乌斯反演
[BZOJ4176]Lucas的数论 Description 去年的Lucas非常喜欢数论题,但是一年以后的Lucas却不那么喜欢了. 在整理以前的试题时,发现了这样一道题目“求Sigma(f(i)) ...
- Lucas的数论(math)
Lucas的数论(math) 题目描述 去年的今日,Lucas仍然是一个热爱数学的孩子.(现在已经变成业界毒瘤了> <) 在整理以前的试题时,他发现了这么一道题目:求\(\sum\limi ...
- BZOJ 4176: Lucas的数论 [杜教筛]
4176: Lucas的数论 题意:求\(\sum_{i=1}^n \sum_{j=1}^n \sigma_0(ij)\) \(n \le 10^9\) 代入\(\sigma_0(nm)=\sum_{ ...
- bzoj 4176 Lucas的数论
bzoj 4176 Lucas的数论 和约数个数和那题差不多.只不过那个题是多组询问,这题只询问一次,并且 \(n\) 开到了 \(10^9\). \[ \begin{align*} \sum_{i= ...
- Mobius反演与积性函数前缀和演学习笔记 BZOJ 4176 Lucas的数论 SDOI 2015 约数个数和
下文中所有讨论都在数论函数范围内开展. 数论函数指的是定义域为正整数域, 且值域为复数域的函数. 数论意义下的和式处理技巧 因子 \[ \sum_{d | n} a_d = \sum_{d | n} ...
- 【bzoj 4176】 Lucas的数论 莫比乌斯反演(杜教筛)
Description 去年的Lucas非常喜欢数论题,但是一年以后的Lucas却不那么喜欢了. 在整理以前的试题时,发现了这样一道题目“求Sigma(f(i)),其中1<=i<=N”,其 ...
- 【bzoj4176】Lucas的数论 莫比乌斯反演+杜教筛
Description 去年的Lucas非常喜欢数论题,但是一年以后的Lucas却不那么喜欢了. 在整理以前的试题时,发现了这样一道题目"求Sigma(f(i)),其中1<=i< ...
- BZOJ4176 Lucas的数论 【莫比乌斯反演 + 杜教筛】
题目 去年的Lucas非常喜欢数论题,但是一年以后的Lucas却不那么喜欢了. 在整理以前的试题时,发现了这样一道题目"求Sigma(f(i)),其中1<=i<=N", ...
随机推荐
- Linq之Expression高级篇(常用表达式类型)
目录 写在前面 系列文章 变量表达式 常量表达式 条件表达式 赋值表达式 二元运算符表达式 一元运算符表达式 循环表达式 块表达式 总结 写在前面 首先回顾一下上篇文章的内容,上篇文章介绍了表达式树的 ...
- 第三十二课:JSDeferred的性能提速
大家如果看了前面两课,就知道Deferred的静态方法next(next_default)是用setTimeout实现的(有浏览器最小时钟间隔).但是实现这种异步操作,可以有很多种方法.JSDefer ...
- Go语言_时间篇
Go的time包是标准库中的包之一 不用说,几乎是开发必须用到的包之一.time包的说明文档在: http://golang.org/pkg/time/ 先注意下Overview中的一句话: The ...
- 每天一个linux命令(34):kill命令
Linux 中的kill命令用来终止指定的进程(terminate a process)的运行,是Linux下进程管理的常用命令.通常,终止一个前台进程可以 使用Ctrl+C键,但是,对于一个后台进程 ...
- 使用background和background-image对CSS优先级造成影响
在写一个关于背景图的CSS时候发现一个奇怪的现象, 原图: 如下代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitiona ...
- python 参数
摘自:http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/00137473844933 ...
- Java-TreeSet
如下: package 集合类.Set类; /** * Set不允许重复数据 */ /** * TreeSet 是用来进行集合排序的,请注意他和LinkedHashSet的区别. TreeSet是按照 ...
- 处理Json数据中的日期类型.如/Date(1415169703000)/格式
在asp.net mvc后台返回到视图中的json数据中想对数据进行操作,发现日期类型无法直接进行操作,需要转换为指定格式才行.在网上也搜了下方法也很多,觉得有点麻烦,最终使用正则搞定了,分享下: v ...
- 活用scanf
scanf()是C语言中用于读入格式化数据(formatted data)的函数. 我们可能对scanf()的一般用法已经了然,而至于scanf()读入数据的机制恐怕并不十分清楚. 下面我将比较详细地 ...
- Spring学习6-Spring整合Struts2
一.Spring为什么要整合Struts2 Struts2与Spring进行整合的根本目的就是要让 Spring为Struts2的Action注入所需的资源对象,它们整合的原理则是只要导入了s ...