LOJ6053 简单的函数
题目传送门
分析:
对于这道题来说,当\(x\)为质数时:
\(~~~~f(x)=x-1+2[x=2]\)
因为除2以外的质数都是奇数,它们与1异或就是减一,然后2就是加一
然后我们先来康康怎么快速求一个子问题:
\(~~~~F(n)=\sum_{i=1}^{n}f(i)[i\in Prime]\)
然后就要学学一个叫min25筛的奇妙的东西
对于一个函数f(x):
1、\(f(x)\)可以用多项式表达。。。(一般都可以吧2333)
2、\(f(x^k)\)可以快速算出(这里的快速是指可以预处理之类的可以很快求出的东西,因为min25筛的复杂度会乘上求\(f(x^k)\)时的复杂度,所以这里的快速算出自己算复杂度拿捏一下就好了)
首先先引入一个函数\(G_{k}(n,m)\)
\(G_{k}(n,m)=\sum_{i=1}^{n}i^k[i\in Prime~||~minP_{i}>P_{m}]\)
其中\(minP_{i}\)代表 \(i\) 的最小质因子,\(P_{m}\)代表第\(m\)个质数
那么在当\(n>1\)时我们的子问题就可以转化:
\(~~~~\sum_{i=1}^{n}f(i)[i\in Prime]\)
\(=\sum_{i=1}^{n}(i-1)[i\in Prime]+2\)
\(=\sum_{i=1}^{n}i^1[i\in Prime]-\sum_{i=1}^{n}i^0[i\in Prime]+2\)
\(=G_{1}(n,|P|)-G_{0}(n,|P|)+2\)
其中\(|P|\)为\(n\)以内的质数个数
奥妙重重
于是乎我们开始思考如何推导\(G_{k}\)
考虑从\(G_{k}(n,m-1)\)推出\(G_{k}(n,m)\)相当于去除最小质因子为\(P_{m}\)的 \(i\) 的\(f(i)\)
容斥一发:
\(~~~G_{k}(n,m)=G_{k}(n,m-1)-P_{m}^k(G_{k}(\lfloor\frac{n}{P_m}\rfloor,m-1)+G_k(P_m-1,m-1))\)
然后\(G_k(n,0)=\sum_{i=1}^{n}i^k\),当\(k\)较小的时候是可以快速求的
递推过程中我们只需要考虑\(\sqrt n\)种取值
然后从前往后枚举质因数较大的取值不会影响小的取值,所以反向更新
复杂度\(O(N/ln\sqrt N)\)
很卡,所以考虑优化
当\(P_m^2>n\)时,\(G_k(n,m)=G_k(n,m-1)\)
剪枝之后的复杂度是\(O(N^\frac{3}{4})\)(不会证dbq),实际上好像会快很多2333
然后我们知道了\(F(n)\)
尝试求一下前缀和\(S(n,m)\)
\(~~~~S(n,m)=\sum_{i=1}^{n}F(i)[minP_i\ge P_m]\)
\(=F(n)-F(P_m-1)+\sum_{i=m}^{|P|}\sum_{j=1}^{P_i^{j-1}~\le N}(f(P_i^j)\cdot S(\lfloor\frac{N}{P_i^j}\rfloor,i+1)+f(P_i^{j+1}))\)
由于\(P_m\le \sqrt N\),这些值的\(F\)值之前筛的时候都是算出来了的(奥妙重重)
那么答案其实就是\(S(N,1)+f(1)\)
\(F(n)\)预处理一下
然后\(S(n,1)\)直接搜
OrzOrz
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
#include<iostream>
#include<map>
#include<string>
#define maxn 500005
#define INF 0x3f3f3f3f
#define MOD 1000000007
#define inv2 500000004
using namespace std;
inline long long getint()
{
long long num=0,flag=1;char c;
while((c=getchar())<'0'||c>'9')if(c=='-')flag=-1;
while(c>='0'&&c<='9')num=num*10+c-48,c=getchar();
return num*flag;
}
long long N,S;
long long pri[maxn],np[maxn],cnt,sumpri[maxn];
long long G0[maxn],G1[maxn];
long long num[maxn],tot;
long long pos1[maxn],pos2[maxn];
inline void init()
{
for(int i=2;i<maxn;i++)
{
if(!np[i])pri[++cnt]=i,sumpri[cnt]=(sumpri[cnt-1]+i)%MOD;
for(int j=1;j<=cnt&&i*pri[j]<maxn;j++)
{
np[i*pri[j]]=1;
if(i%pri[j]==0)break;
}
}
}
inline long long getsum(long long n,long long m)
{
if(n<2||pri[m]>n)return 0;
long long k=(n<=S)?pos1[n]:pos2[N/n],ret=(G1[k]-sumpri[m-1]-G0[k]+m-1)%MOD;
ret+=(m==1)<<1;
for(int i=m;i<=cnt&&pri[i]*pri[i]<=n;i++)
{
long long tmp=pri[i];
for(int j=1;tmp*pri[i]<=n;j++,tmp*=pri[i])
ret=(ret+(getsum(n/tmp,i+1)*(pri[i]^j)%MOD)+(pri[i]^(j+1))%MOD)%MOD;
}
return ret;
}
int main()
{
init();
N=getint();
S=sqrt(N);
for(long long i=1,j;i<=N;i=j+1)
{
j=N/(N/i);num[++tot]=N/i;
G0[tot]=(num[tot]-1)%MOD;
G1[tot]=(num[tot]%MOD)*((num[tot]+1)%MOD)%MOD*inv2%MOD;
G1[tot]--;
if(num[tot]<=S)pos1[num[tot]]=tot;
else pos2[j]=tot;
}
for(int j=1;j<=cnt;j++)
for(int i=1;i<=tot&&pri[j]*pri[j]<=num[i];i++)
{
int k=(num[i]/pri[j]<=S)?pos1[num[i]/pri[j]]:pos2[N/(num[i]/pri[j])];
(G0[i]+=MOD-(G0[k]-(j-1))%MOD)%=MOD;
(G1[i]+=MOD-pri[j]*(G1[k]-sumpri[j-1])%MOD)%=MOD;
}
printf("%lld\n",(getsum(N,1)+1+MOD)%MOD);
}

LOJ6053 简单的函数的更多相关文章
- LOJ6053 简单的函数 【Min_25筛】【埃拉托斯特尼筛】
先定义几个符号: []:若方括号内为一个值,则向下取整,否则为布尔判断 集合P:素数集合. 题目分析: 题目是一个积性函数.做法之一是洲阁筛,也可以采用Min_25筛. 对于一个可以进行Min_25筛 ...
- LOJ6053 简单的函数(min_25筛)
题目链接:LOJ 题目大意:从前有个积性函数 $f$ 满足 $f(1)=1,f(p^k)=p\oplus k$.(异或)求其前 $n$ 项的和对 $10^9+7$ 取模的值. $1\le n\le 1 ...
- [LOJ6053]简单的函数:Min_25筛
分析 因为题目中所给函数\(f(x)\)的前缀和无法较快得出,考虑打表以下两个函数: \[ g(x)=x \times [x是质数] \] \[ h(x)=1 \times [x是质数] \] 这两个 ...
- Case when 的用法,简单Case函数
Case when 的用法,简单Case函数 简单CASE表达式,使用表达式确定返回值. 语法: CASE search_expression WHEN expression1 THEN result ...
- python之简单的函数介绍(http://docs.python.org/3/library)
Python不但能非常灵活地定义函数,而且本身内置了很多有用的函数,可以直接调用. 在上面的网站上我们可以进行查询,Python具体都有哪些函数. 我们也可以再交互命令行中来查找函数: >> ...
- php简单表格函数
php简单表格函数 代码 <?php //ctrl+shift+j /** * @param unknown $rows * @param unknown $cols * @param stri ...
- python简单的函数定义和用法实例
python简单的函数定义和用法实例 这篇文章主要介绍了python简单的函数定义和用法,实例分析了Python自定义函数及其使用方法,具有一定参考借鉴价值,需要的朋友可以参考下 具体分析如下: 这里 ...
- python简单的函数应用
一个简单的函数应用,包括自定义函数,lambda函数,列表解析. 1 #!usr/bin/env python3 2 # -*- coding:utf-8 -*- 3 4 #开始定义函数 5 def ...
- 【LOJ6053】简单的函数(min_25筛)
题面 LOJ 题解 戳这里 #include<iostream> #include<cstdio> #include<cstdlib> #include<cs ...
随机推荐
- 【39.87%】【BZOJ 1880】[Sdoi2009]Elaxia的路线
Time Limit: 4 Sec Memory Limit: 64 MB Submit: 1041 Solved: 415 [Submit][Status][Discuss] Descripti ...
- Vue的数据双向绑定和Object.defineProperty()
Vue是前端三大框架之一,也被很多人指责抄袭,说他的两个核心功能,一个数据双向绑定,一个组件化分别抄袭angular的数据双向绑定和react的组件化思想,咱们今天就不谈这种大是大非,当然我也没到达那 ...
- 【Linux】Terminal中输入一行命令快速移动光标至行首行尾
Linux: ①快速移动光标至行首 Home或Ctrl+A ②快速移动光标至行尾 End或Ctrl+E ③从光标处开始删除,直到行尾 Ctrl+K ④到下一行 Ctrl+N 或 方向键:↓ ⑤到上一行 ...
- 深入CAS的底层实现机制,以及对应的使用风险
概述 CAS(Compare-and-Swap),即比较并替换,是一种实现并发算法时常用到的技术,Java并发包中的很多类都使用了CAS技术.CAS也是现在面试经常问的问题,本文将深入的介绍CAS的原 ...
- 浅谈Java中接口与抽象类的异同
浅谈Java中接口与抽象类的异同 抽象类和接口这两个概念困扰了我许久,在我看来,接口与抽象类真的十分相似.期间也曾找过许许多多的资料,参考了各路大神的见解,也只能是简简单单地在语法上懂得两者的区别.硬 ...
- 机器学习回顾篇(13):集成学习之AdaBoost
.caret, .dropup > .btn > .caret { border-top-color: #000 !important; } .label { border: 1px so ...
- 【Python3爬虫】反反爬之解决前端反调试问题
一.前言 在我们爬取某些网站的时候,会想要打开 DevTools 查看元素或者抓包分析,但按下 F12 的时候,却出现了下面这一幕: 此时网页暂停加载,也就没法运行代码了,直接中断掉了,难道这就能阻止 ...
- Python for Data Analysis 学习心得(三) - 文件读写和数据预处理
一.Pandas文件读写 pandas很核心的一个功能就是数据读取.导入,pandas支援大部分主流的数据储存格式,并在导入的时候可以做筛选.预处理.在读取数据时的选项有超过50个参数,可见panda ...
- java小项目之:植物大战僵尸,这个僵尸有点冷!内附素材源码
Java小项目之:植物大战僵尸! <植物大战僵尸>是由PopCap Games开发的一款益智策略类单机游戏,于2009年5月5日发售,这款游戏可谓是无人不知无人不晓. 在我身边,上到40岁 ...
- 【转】7本免费的Java电子书和教程
本文由 ImportNew - 唐小娟 翻译自 Javapapers.如需转载本文,请先参见文章末尾处的转载要求. 1. Thinking in Java (Third Edition) 本书的作者是 ...