码迷,mamicode.com
首页 > 其他好文 > 详细

【bzoj2721】[Violet 5]樱花 数论

时间:2017-06-13 16:56:15      阅读:129      评论:0      收藏:0      [点我收藏+]

标签:素数   com   amp   scan   ++   span   input   microsoft   alt   

题目描述

技术分享

输入

技术分享

输出

技术分享

样例输入

2

样例输出

3


题解

数论

设1/x+1/y=1/m,那么xm+ym=xy,所以xy-xm-ym+m^2=m^2,所以(x-m)(y-m)=m^2.

所以解的数量就是m^2的约数个数。

所以只需要算出n!中每个素数的出现次数即可。

我们可以先快筛出1~n的素数,然后考虑每个素数出现的次数。

而p出现的次数为包含p^1的数的个数+包含p^2的数的个数+...+包含p^k的数的个数,我们可以迭代来求。

最后把它们乘2加1再乘到一起即可。

#include <cstdio>
#include <algorithm>
#define N 1000010
using namespace std;
int prime[N] , tot , cnt[N];
bool np[N];
int main()
{
	int n , i , j;
	long long ans = 1;
	scanf("%d" , &n);
	for(i = 2 ; i <= n ; i ++ )
	{
		if(!np[i]) prime[++tot] = i;
		for(j = 1 ; j <= tot && i * prime[j] <= n ; j ++ )
		{
			np[i * prime[j]] = 1;
			if(i % prime[j] == 0) break;
		}
	}
	for(i = 1 ; i <= tot ; i ++ )
	{
		for(j = n ; j ; j /= prime[i]) cnt[i] += j / prime[i];
		ans = ans * (2 * cnt[i] + 1) % 1000000007;
	}
	printf("%lld\n" , ans);
	return 0;
}

 

 

 

【bzoj2721】[Violet 5]樱花 数论

标签:素数   com   amp   scan   ++   span   input   microsoft   alt   

原文地址:http://www.cnblogs.com/GXZlegend/p/7000796.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!