首页 > 其他分享 >Loj 6053 简单的函数 min25筛

Loj 6053 简单的函数 min25筛

时间:2022-11-14 20:45:39浏览次数:68  
标签:ll Loj min25 top MAXN include 质数 6053 define

#6053. 简单的函数

先求g(n,j) 目的是为了在求S(n,j)的时候可以快速获取一些质数上的点的值。

所以我们只要求g(n,j)的质数处的值正确即可其他值则不需要 所以我们可以让g所对应的函数关系满足完全积性函数。

对于这道题 我们令 g2(x)=x g1(x)=1, g=g2-g1 这样除了质数2处的点值其他质数处点值均合法 并且g1,g2均为完全积性函数.

注意到g1是必要的也要进行一遍dp 因为我们没法得到1~n内质数的个数。

所进行的dp不再赘述。接着求S(n,j) 我的含义是只1~n内最小质因子>=j的点的函数值之和。

这样可以不把1包括进去好写还好理解。每次先把j~n内质数点值获取了再枚举质数的次数来求其他处的点值。

code
//#include<bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<ctime>
#include<cctype>
#include<queue>
#include<deque>
#include<stack>
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cstring>
#include<string>
#include<ctime>
#include<cmath>
#include<cctype>
#include<cstdlib>
#include<queue>
#include<deque>
#include<stack>
#include<vector>
#include<algorithm>
#include<utility>
#include<bitset>
#include<set>
#include<map>
#define ll long long
#define db double
#define INF 2000000000
#define inf 100000000000000000ll
#define ldb long double
#define pb push_back
#define put_(x) printf("%d ",x);
#define get(x) x=read()
#define putl(x) printf("%lld\n",x)
#define rep(p,n,i) for(int i=p;i<=n;++i)
#define go(x) for(int i=lin[x],tn=ver[i];i;tn=ver[i=nex[i]])
#define pii pair<int,int>
#define mk make_pair
#define P 1000000007ll
#define gf(x) scanf("%lf",&x)
#define pf(x) ((x)*(x))
#define uint unsigned long long
#define ui unsigned
#define sq sqrt
#define a(x) t[x].a
#define sum(x) t[x].sum
#define b(x) t[x].b
#define F first
#define S second
#define mod 1000000007
#define sc(A) scanf("%d",&A)
#define scs(A) scanf("%s",A);
#define put(A) printf("%d\n",A)
#define min(x,y) (x>=y?y:x)
#define max(x,y) (x>=y?x:y)
#define add(x,y) (x+y>=mod?x+y-mod:x+y)
using namespace std;
const int MAXN=200010;
//g1i=1 g2i=i;
ll n;
int maxx,cnt,top;
ll g1[MAXN],g2[MAXN],w[MAXN];
int sum1[MAXN],sum2[MAXN],id1[MAXN],id2[MAXN],v[MAXN],p[MAXN];
inline void prepare()
{
	rep(2,maxx,i)
	{
		if(!v[i])
		{
			v[i]=p[++top]=i;
			sum1[top]=sum1[top-1]+1;
			sum2[top]=add(sum2[top-1],i);
		}
		rep(1,top,j)
		{
			if(p[j]>maxx/i)break;
			v[p[j]*i]=p[j];
			if(v[i]==p[j])break;
		}
	}
}
inline void calc()
{
	for(ll i=1,j;i<=n;i=j+1)
	{
		w[++cnt]=n/i;
		j=n/w[cnt];
		g1[cnt]=w[cnt]%mod;
		g2[cnt]=(g1[cnt]+1)*(g1[cnt])/2%mod-1;
		--g1[cnt];
		if(w[cnt]<=maxx)id1[w[cnt]]=cnt;
		else id2[j]=cnt;
	}
	rep(1,top,i)
	{
		rep(1,cnt,j)
		{
			if((ll)p[i]*p[i]>w[j])break;
			ll cc=w[j]/p[i],k;
			if(cc<=maxx)k=id1[cc];else k=id2[n/cc];
			g1[j]=(g1[j]-(g1[k]-sum1[i-1]))%mod;
			g2[j]=(g2[j]-p[i]*(g2[k]-sum2[i-1])%mod)%mod;
		}
	}
}
inline int S(ll x,int y)//1~x内 最小质因子大于等于y的数的答案和.
{
	if(x<=1||p[y]>x)return 0;
	int k=x<=maxx?id1[x]:id2[n/x];
	ll ans=(g2[k]-g1[k]-sum2[y-1]+sum1[y-1])%mod;
	for(int i=y;i<=top;++i)
	{
		if((ll)p[i]*p[i]>x)break;
		ll pe=p[i],pp=pe*pe;
		for(int e=1;pp<=x;++e,pe=pp,pp*=p[i])
		{
			ans=(ans+(ll)(p[i]^e)*S(x/pe,i+1)+(p[i]^(e+1)))%mod;
		}
	}
	return ans;
}
signed main()
{
	freopen("1.in","r",stdin);
	scanf("%lld",&n);
	if(n==1){puts("1");return 0;}
	maxx=(int)sqrt(n*1.0)+1;
	prepare();calc();put(((S(n,1)+3)+mod)%mod);
	return 0;
}

标签:ll,Loj,min25,top,MAXN,include,质数,6053,define
From: https://www.cnblogs.com/chdy/p/16890330.html

相关文章

  • LOJ10150
    题目描述Hecy又接了个新任务:BE处理。BE中有一类被称为GBE。以下是GBE的定义:空表达式是GBE如果表达式A是GBE,则[A]与(A)都是GBE如果A与B都是GBE,那......
  • loj #10069. 「一本通 3.1 练习 4」Tree
    给你一个无向带权连通图,每条边是黑色或白色。求一棵最小权的恰好有K条白色边的生成树。题目保证有解  二分一个增加量md, 给每个白边权值加md,跑一下kruskal,......
  • loj#10064 黑暗城堡
     求图中的最短路径生成树有多少个?(该生成树中的任意点i,i到1的距离和 原图中的i到1的最短距离相等  跑所有点到1的单源最短路,d[i] ifd[i]==d[y]+z,那么z这个路......
  • 「LOJ2474」北校门的未来
    题目点这里看题目。你有一棵树\(T\),初始时\(T=(V=\{1\},E=\varnothing)\)。你将要进行\(q\)次操作,每次操作的形式为以下两种之一:第一种操作:给定参数\(x,y\),保证......
  • 【XSY3473】Frog(min25筛)
    一些记号:记\(\mathbb{P}\)为质数集,\(p_i\)表示第\(i\)个质数。记\(\operatorname{lpf}(x)\)表示\(x\)的最小质因数为第几个质数。特别地,令\(\operatorname{l......
  • SLOJ P10219 「一本通 6.5 例 1」矩阵 A×B
    题目描述矩阵 AA 规模为n×m,矩阵 BB 规模为m×p,现需要你求A×B。矩阵相乘的定义:n×m 的矩阵与m×p 的矩阵相乘变成n×p 的矩阵,令aik​为矩阵A中的元素,bkj​为矩阵......
  • loj10135.「一本通 4.4 练习 2」祖孙询问
    SLOJP10135.「一本通4.4练习2」祖孙询问题目描述已知一棵n个节点的有根树。有m个询问,每个询问给出了一对节点的编号x和y,询问x与y的祖孙关系。输入格式输入第一行......
  • LOJ6564 最长公共子序列
    link:https://loj.ac/p/6564就是求LCS,数据范围变成\(70000\)了。还是考虑朴素的DP状态\(f(i,j)=\max\{f(i-1,j),f(i,j-1),[a_i=b_j]f(i-1,j-1)\}\)。一个可能有用......
  • LOJ #2589. 「NOIP2009」Hankson 的趣味题
    题目链接:​​传送门​​分析题目要求,,也就是说是的因子,是的因子直接枚举(也就是的因子),另外一个就是然后满足上面两个条件的就,注意判断和相等的情况毫无技术含量#include<......
  • LOJ #2274. 「JXOI2017」加法
    题目链接:​​传送门​​最小值最大化,首先是很明显的二分其次是很明显的贪心,因为我们要选择一定数量的区间进行操作二分最后的这个最大值在check函数中把数组中值小于二......