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---左外联查询
花了好半天才解决这个问题,终于在网上找到了答案,在此记录备份. 参考连接:http://bbs.csdn.net/topics/390150047 自己总结的如下: 结构就不说了,最后大家自己下源码看 ...
- AngularJs-MVC之路由、模块以及依赖注入
前面呢,我们大概的了解了下AngularJs的入门,也做过了hello world的一个demo,不知道大家有没有掌握呢?在下面我们需要讲一些AngularJS的一些干货. 1,一个完整项目的目录结构 ...
- Linux svn 回滚版本库
Linux代码 svn up Index/ 然后找出要撤销的确切版本: Linux代码 svn log --limit 10 Index/tpl/css/global.css 根据log怀疑是 ...
- ssh scp ssh-copy-id 非22端口的操作方法
(1)首先我们来看一下ssh-copy-id的非22端口的操作方法 ssh-copy-id -i ~/.ssh/id_rsa.pub "-p 10056 wwwad@192.168.20. ...
- VS中两个常用辅助工具
一. 首当推荐的是DPack 下载地址:http://www.usysware.com/dpack/ 快捷键:以下都是个人常用的热键.其他还有,我都用得比较少了,3个已经完全够了 Alt+U 查找 ...
- Java基础-常量池
在class文件中,“常量池”是最复杂也最值得关注的内容. Java是一种动态连接的语言,常量池的作用非常重要,常量池中除了包含代码中所定义的各种基本类型(如int.long等等)和对象型(如Stri ...
- selenium常见的疑问和问题
.确认(verifation)和断言(assert)有什么区别? 确认:当测试中的一个用例存在错误时,系统将会继续运行这些测试 断言:当测试中的一个用例存在错误时,系统将会退出当前用例 总而言之 ...
- webservice配置
服务端配置:第一步:引用jar包commons-httpclient.jarcommons-logging.jarjdom-10.jarwsdl4j-1.6.1.jarxbean-spring-2.8 ...
- SpringMVC配置
博客园 闪存 首页 新随笔 联系 管理 订阅 随笔- 4 文章- 1 评论- 0 搭建springmvc框架的另一种思路 在一个完整的项目里搭建springmvc框架的时候, 通常情况下,初学者 ...
- POJ1995 Raising Modulo Numbers
Raising Modulo Numbers Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 6373 Accepted: ...