博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
暑假D17 T2 简单题1(杜教筛)
阅读量:4538 次
发布时间:2019-06-08

本文共 1526 字,大约阅读时间需要 5 分钟。

题目描述

珈百璃刚刚学习了杜教筛,想做一道简单题练练手。给出N,求:

$\sum_{i=1}^{N}i\mu(i)$,答案对$1e9+7$ 取模

对于100%的数据,$N\leq 1e10$。

题解

利用上午讲的可以得到

$h(n)=\sum_{d|n}d\mu(d)g(\frac{n}{d})$

当$g(x)=x$时

$h(n)=\sum_{d|n}n\mu(d)$

$h(n)=n\sum_{d|n}\mu(d)$

$h(n)=n[n=1]$

再直接套模板就好了$S(n)=\frac{\sum_{i=1}^{n}h(i) - \sum_{i=2}^{n}    g(i) S(\left \lfloor \frac{n}{i} \right \rfloor) }{g(1)}$

 

#include
using namespace std;#define ll long longconst int mod=1000000007;const ll inv=500000004;const int maxn=6000000;ll n;ll cnt,prime[maxn+6],mu[maxn+6],s[maxn+6];bool not_prime[maxn+6];//h=f*g//f(x)=x*mu(x)//g(x)=x//h(x)=n*[n==1]void init(){ s[1]=mu[1]=1; for(int i=2;i<=maxn;i++){ if(!not_prime[i]){ prime[++cnt]=i; mu[i]=-1; } s[i]=((s[i-1]+i*mu[i])%mod+mod)%mod; for(int j=1;prime[j]*i<=maxn;j++){ not_prime[i*prime[j]]=true; if(i%prime[j]) mu[i*prime[j]]=-mu[i]; else { mu[i*prime[j]]=0; break; } } }}map
mp;ll djs(ll n){ if(n<=maxn) return s[n]; if(mp[n]) return mp[n]; ll ans=1; for(ll l=2,r;l<=n;l=r+1){ r=n/(n/l); ll cx=((l+r)%mod)*((r-l+1)%mod)%mod*inv%mod; ans=(ans-cx*djs(n/l)%mod)%mod; } return mp[n]=(ans+mod)%mod;}int main(){ freopen("b.in","r",stdin); freopen("b.out","w",stdout); scanf("%lld",&n); init(); printf("%lld",djs(n));}
View Code

小心爆long long,l、r可能到达1e10;

整除分块的操作也在里面。

 

转载于:https://www.cnblogs.com/sto324/p/11272422.html

你可能感兴趣的文章
htmlunit简单百度搜索,网页解析
查看>>
Cocos2dx Android在编译的时候格式出错例如(snprintf)
查看>>
spring不同环境下用不同的配置文件
查看>>
数组_leetcode80
查看>>
SQL Error (1130): Host '192.168.1.100' is not allowed to connect to this MySQL server
查看>>
普通线程类获取service,controller等spring容器类
查看>>
Redis高级实践之————Redis短连接性能优化
查看>>
ThreadLocal使用
查看>>
POJ - 2155 Matrix(二维树状数组)
查看>>
基于Cat的分布式调用追踪
查看>>
建筑物联动
查看>>
汇编语言 手记5
查看>>
牛客网暑期ACM多校训练营(第三场) E-Sort String next数组的应用
查看>>
如何成功的捕捉一只女神
查看>>
有关HTTP的粗读
查看>>
连接mysql数据库,创建用户模型
查看>>
Uncaught TypeError: (intermediate value)(...) is not a function
查看>>
NOIP模拟:能源(二分答案)
查看>>
模拟I2C协议学习点滴之原理框架
查看>>
数组中重复的数字
查看>>