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", ...
随机推荐
- Go-MySQL-Driver:一个Go语言的轻量级极速的mysql驱动
Go语言的 database/sql 包的一个 MySQL驱动. 特性 轻量级与快速 原生Go语言,没有C绑定,只有纯Go 没有不安全的操作(类型转换等) 动态处理崩溃的连接 动态连接池 支持大于16 ...
- iOS边练边学--父子控件之作为导航控制器的子类产生的问题以及网易新闻练习
一.导航控制器的子类 作为导航控制器的子类,并且是导航控制器子类中的第一个,系统会默认给子控件添加EdgeInsert属性,把导航栏的宽度挤出来.但是系统只会默认修改第一个. 解决办法1:系统帮忙给第 ...
- 【BZOJ 3223】文艺平衡树 模板题
就是打个翻转标记,下推标记时记得交换左右孩子指针,查询kth和中序遍历输出时也记得要下推标记同时交换指针,二者不可缺!←这是易错点 仿陈竞潇学长模板的代码: #include<cctype> ...
- 3.Android之单选按钮RadioGroup和复选框Checkbox学习
单选按钮和复选框在实际中经常看到,今天就简单梳理下. 首先,我们在工具中拖进单选按钮RadioGroup和复选框Checkbox,如图: xml对应的源码: <?xml version=&quo ...
- codeforces 359D 二分答案+RMQ
上学期刷过裸的RMQ模板题,不过那时候一直不理解>_< 其实RMQ很简单: 设f[i][j]表示从i开始的,长度为2^j的一段元素中的最小值or最大值 那么f[i][j]=min/max{ ...
- IRP IO_STACK_LOCATION 《寒江独钓》内核学习笔记(1)
在学习内核过滤驱动的过程中,遇到了大量的涉及IRP操作的代码,这里有必要对IRP的数据结构和与之相关的API函数做一下笔记. 1. 相关阅读资料 <深入解析 windows 操作系统(第4版,中 ...
- C++ 中常见预定义宏的使用
http://blog.csdn.net/hgl868/article/details/7058906 替代字符串: #define DOWNLOAD_IMAGE_LOG /var/log/png.l ...
- AndroidManifest File Features
http://www.android-doc.com/guide/topics/manifest/manifest-intro.html The following sections describe ...
- android 读取sd卡中的图片
一.获取读取SD卡的权限 <!--在SDCard中创建与删除文件权限 --> <uses-permission android:name="android.perm ...
- 初学JDBC,调用存储过程
在JDBC简单封装的基础上实现 public class UserDao{ public static void testGetUser(String userName) throws Excepti ...