HDU-2973 YAPTCHA

题目传送门

先把题目中的公式弄过来。

S n = ∑ k = 1 n ⌊ ( 3 k + 6 ) ! + 1 3 k + 7 − ⌊ ( 3 k + 6 ) ! 3 k + 7 ⌋ ⌋ S_n=\sum\limits_{k=1}^{n}\lfloor\frac{(3k+6)!+1}{3k+7}-\lfloor\frac{(3k+6)!}{3k+7}\rfloor\rfloor Sn=k=1∑n⌊3k+7(3k+6)!+1−⌊3k+7(3k+6)!⌋⌋

首先,得先了解威尔逊定理

威尔逊定理(证明后续发)

对于一个素数 p p p,有:
( p − 1 ) ! ≡ − 1 ( m o d p ) (p-1)!\equiv-1(mod\ p) (p−1)!≡−1(mod p)

分析

然后通过威尔逊定理来分析题目。

我们设 x = 3 k + 7 x=3k+7 x=3k+7,那么上面的式子就变成了:
S n = ∑ k = 1 n ⌊ ( x − 1 ) ! + 1 x − ⌊ ( x − 1 ) ! x ⌋ ⌋ S_n=\sum\limits_{k=1}^{n}\lfloor\frac{(x-1)!+1}{x}-\lfloor\frac{(x-1)!}{x}\rfloor\rfloor Sn=k=1∑n⌊x(x−1)!+1−⌊x(x−1)!⌋⌋

x是素数

由于威尔逊定理,当 x x x是素数时, ( x − 1 ) ! + 1 ≡ 0 ( m o d p ) (x-1)!+1\equiv0(mod\ p) (x−1)!+1≡0(mod p),那么 ( x − 1 ) ! + 1 x \frac{(x-1)!+1}{x} x(x−1)!+1就一定是一个整数,所以 ⌊ ( x − 1 ) ! x ⌋ \lfloor\frac{(x-1)!}{x}\rfloor ⌊x(x−1)!⌋就是一个比 ( x − 1 ) ! + 1 x \frac{(x-1)!+1}{x} x(x−1)!+1小 1 1 1的整数,所以原式的值为 1 1 1。

x是合数

当 x x x是合数时,就一定有两个数 a a a和 b b b,满足 1 < a < b < x 1<a<b<x 1<a<b<x,所以 ( x − 1 ) ! x \frac{(x-1)!}{x} x(x−1)!就是一个整数。又由于 k ≥ 1 k\ge1 k≥1,所以 x > 1 x>1 x>1,那么 ( x − 1 ) ! + 1 x − ( x − 1 ) ! x < 0 \frac{(x-1)!+1}{x}-\frac{(x-1)!}{x}<0 x(x−1)!+1−x(x−1)!<0,可以得出 ⌊ ( x − 1 ) ! + 1 x − ( x − 1 ) ! x ⌋ = 0 \lfloor\frac{(x-1)!+1}{x}-\frac{(x-1)!}{x}\rfloor=0 ⌊x(x−1)!+1−x(x−1)!⌋=0

总结

所以综上可得,只需要判断 x x x,即 3 k + 7 3k+7 3k+7是不是素数,问题就迎刃而解了。

cpp 复制代码
#include<bits/stdc++.h>
#define endl putchar('\n')
using namespace std;
const int N=5e6+5;
int read(){
	int x=0,f=1;
	char c=getchar();
	while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
	while(c>='0'&&c<='9')x=(x<<3)+(x<<1)+c-'0',c=getchar();
	return x*f;
}
void print(int x){
	if(x<0)putchar('-'),x=-x;
	if(x<10){putchar(x+'0');return;}
	print(x/10);
	putchar(x%10+'0');
}
int T;
int vis[N];
int p[N];
int cnt;
int f[N];
signed main(){
	for(int i=2;i<=3e6+10;i++){//素数筛
		if(!vis[i])p[++cnt]=i;
		for(int j=1;j<=cnt&&i*p[j]<=3e6+10;j++)vis[i*p[j]]=1;
	}
	for(int i=1;i<=1e6;i++)f[i]=f[i-1]+(!vis[3*i+7]);//计算前缀和
	T=read();
	while(T--){
		print(f[read()]);
		endl;
	}
}
相关推荐
Luhui Dev17 小时前
如何在 WorkBuddy 中使用大角几何:从 MCP 接入到 AI 几何作图
人工智能·数学·算法·agent·luhuidev
金銀銅鐵4 天前
[Python] 借助 Turtle 来展示汉诺塔
python·数学
雪碧聊技术4 天前
【数学/高数】洛必达法则详解:从原理到实战例题(附手写笔记解析)
数学·洛必达法则·等价无穷小
TechEdu2026065 天前
[通信与计算]通信中的数学:核心概念与工程联系
数学·信息与通信·通信系统
金銀銅鐵6 天前
[Python] 借助 Pillow 和 NumPy 生成与斐波那契数列有关的图案
python·数学
Tisfy7 天前
LeetCode 3345.最小可整除数位乘积 I:暴力枚举(从n开始尝试)
数学·算法·leetcode·题解·枚举
闻缺陷则喜何志丹7 天前
【高等几何 梅向明】正交变换与仿射变换
数学·仿射变换·高等几何·投影几何·正交变换
Luhui Dev10 天前
几何题配图 API 怎么选?从文本生成到可编辑源文件的接入指南
人工智能·数学·agent·luhuidev
EQUINOX112 天前
【NCE】
数学
Tisfy14 天前
LeetCode 3014.输入单词需要的最少按键次数 I:遍历 / if-else计算(比纯数学公式写起来麻烦但好想)
数学·算法·leetcode·字符串·题解·贪心