BZOJ 4176: Lucas的数论 莫比乌斯反演 杜教筛

4176: Lucas的数论

Time Limit: 30 Sec  Memory Limit: 256 MB
Submit: 378  Solved: 242
[Submit][Status][Discuss]

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。


化式子和下面的链接基本一样

BZOJ 3994: [SDOI2015]约数个数和 莫比乌斯反演

杜教筛搞前缀和就好了


ans会<0 竟然调了一中午 太傻了

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;

typedef long long ll;

inline int read()
{
	int x=0,f=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch<='9'&&ch>='0'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
	return f*x;
}
void print(int x)
{if(x<0)putchar('-'),x=-x;if(x>=10)print(x/10);putchar(x%10+'0');}

const int N=1000100,mod=1000000007;

int prime[N],mobius[N],M[N];
bool book[N];

void initial()
{
	register int i,j,cnt=0;
	mobius[1]=1;
	for(i=2;imp;

int getsum(int x)
{
	if(x

你可能感兴趣的:(杜教,洲阁,莫比乌斯,—————————数学)