zoukankan      html  css  js  c++  java
  • 【刷题】BZOJ 4176 Lucas的数论

    Description

    去年的Lucas非常喜欢数论题,但是一年以后的Lucas却不那么喜欢了。

    在整理以前的试题时,发现了这样一道题目“求Sigma(f(i)),其中1<=i<=N”,其中 表示i的约数个数。他现在长大了,题目也变难了。

    求如下表达式的值:

    其中 表示ij的约数个数。

    他发现答案有点大,只需要输出模1000000007的值。

    Input

    第一行一个整数n。

    Output

    一行一个整数ans,表示答案模1000000007的值。

    Sample Input

    2

    Sample Output

    8

    HINT

    对于100%的数据n <= 10^9。

    Solution

    弱化版在【刷题】BZOJ 3994 [SDOI2015]约数个数和

    式子一模一样

    把最后的式子用杜教筛求就好了

    #include<bits/stdc++.h>
    #define ui unsigned int
    #define ll long long
    #define db double
    #define ld long double
    #define ull unsigned long long
    const int MAXN=1000000+10,Mod=1e9+7;
    int n,cnt,vis[MAXN],prime[MAXN],mu[MAXN],s[MAXN];
    std::map<int,ll> M;
    template<typename T> inline void read(T &x)
    {
    	T data=0,w=1;
    	char ch=0;
    	while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
    	if(ch=='-')w=-1,ch=getchar();
    	while(ch>='0'&&ch<='9')data=((T)data<<3)+((T)data<<1)+(ch^'0'),ch=getchar();
    	x=data*w;
    }
    template<typename T> inline void write(T x,char ch='')
    {
    	if(x<0)putchar('-'),x=-x;
    	if(x>9)write(x/10);
    	putchar(x%10+'0');
    	if(ch!='')putchar(ch);
    }
    template<typename T> inline void chkmin(T &x,T y){x=(y<x?y:x);}
    template<typename T> inline void chkmax(T &x,T y){x=(y>x?y:x);}
    template<typename T> inline T min(T x,T y){return x<y?x:y;}
    template<typename T> inline T max(T x,T y){return x>y?x:y;}
    inline void init()
    {
    	memset(vis,1,sizeof(vis));
    	vis[0]=vis[1]=0;
    	mu[1]=1;
    	for(register int i=2;i<MAXN;++i)
    	{
    		if(vis[i])
    		{
    			prime[++cnt]=i;
    			mu[i]=-1;
    		}
    		for(register int j=1;j<=cnt&&i*prime[j]<MAXN;++j)
    		{
    			vis[i*prime[j]]=0;
    			if(i%prime[j])mu[i*prime[j]]=-mu[i];
    			else break;
    		}
    	}
    	for(register int i=1;i<MAXN;++i)s[i]=(s[i-1]+mu[i])%Mod;
    }
    inline ll S(int x)
    {
    	if(x<MAXN)return s[x];
    	if(M.find(x)!=M.end())return M[x];
    	ll res=0;
    	for(register int i=2;;)
    	{
    		if(i>x)break;
    		int j=x/(x/i);
    		(res+=1ll*(j-i+1)*S(x/i)%Mod)%=Mod;
    		i=j+1;
    	}
    	return M[x]=(1-res+Mod)%Mod;
    }
    inline ll f(int x)
    {
    	ll res=0;
    	for(register int i=1;;)
    	{
    		if(i>x)break;
    		int j=x/(x/i);
    		(res+=1ll*(j-i+1)*(x/i)%Mod)%=Mod;
    		i=j+1;
    	}
    	return res;
    }
    int main()
    {
    	read(n);init();
    	ll res=0;
    	for(register int i=1;;)
    	{
    		if(i>n)break;
    		int j=n/(n/i);
    		ll now=f(n/i);
    		(res+=1ll*(S(j)-S(i-1)+Mod)%Mod*now%Mod*now%Mod)%=Mod;
    		i=j+1;
    	}
    	write(res,'
    ');
    	return 0;
    }
    
  • 相关阅读:
    MYSQL索引
    列表里重复次数最多的元素
    python学习笔记
    Spark 扫描 HDFS lzo/gz/orc异常压缩文件
    Yarn RM写ZNode超数据量限制bug修复
    Spark HistoryServer日志解析&清理异常
    【Yarn源码分析】Container启动流程源码分析
    Yarn NodeManager总体架构
    【Yarn源码分析】ApplicationMaster源码分析
    【Yarn源码分析】FairScheduler资源调度
  • 原文地址:https://www.cnblogs.com/hongyj/p/9562625.html
Copyright © 2011-2022 走看看