威尔逊定理

威尔逊定理:(p-1)!\equiv 1(mod~p)是 p 为质数的充要条件

推论一:如果 p 是质数,(p-1)!+1\equiv 0(mod~p)

推论二:如果 p 是大于4的合数,(p-1)!\equiv 0(mod~p)

下面用一道实际应用题来举例:

给定n,求:

分析:

令p=3k+7则S_{n}= \left \lfloor \frac{(p-1)!+1}{p}- \left \lfloor \frac{(p-1)!}{p} \right \rfloor \right \rfloor

1. 当p为质数时,前面是整数,后面向下取的整数,结果为1

2. p是大于4的合数时,后面为整数,前面为略大于后面的小数,向下取整为0

所以只要统计p是质数的个数就行

pass代码:

#include<iostream>
using namespace std;
int prime[3000000];
int notprime[3000000];
int need[1000000];
int sum = 0;
int psize = 1;
void getprime()
{
	for (long long i = 2; i <= 3000000; i++)
	{
		if (notprime[i])continue;
		for (long long j = i*i; j <= 3000000; j+=i)
		{
			notprime[j] = 1;
		}
		if ((i - 7) % 3 == 0 && i != 7)
		{
			prime[(i-7)/3] = 1;
		}
	}
}
int main()
{
	int t;
	cin >> t;
	getprime();
	for (long long k = 2; k <= 1000000; k++)
	{
		need[k] = need[k - 1] + prime[k];
	}
	for (int i = 0; i < t; i++)
	{
		int sum = 0;
		int n;
		cin >> n;
		cout << need[n] << endl;
	}
}

刚开始,我将need[ ]大小设为3000000,然后下面给need赋值也循环3000000次,明显超时而且超内存,后面发现将上面有prime[ i ](输出need[ n*3+7 ])改为prime[ (i+7)/3 ](输出need[ n ])这样就可以缩小need的大小了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值