C#版 - HDUoj 5391 - Zball in Tina Town(素数) - 题解
版权声明: 本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址
http://blog.csdn.net/lzuacm。
HDUoj 5391 - Zball in Tina Town
在线提交:
http://acm.hdu.edu.cn/showproblem.php?pid=5391
Time Limit: 3000/1500 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)
Total Submission(s): 2790 Accepted Submission(s): 1309
题目大意:
Tina Town 是一个善良友好的地方, 这里的每一个人都互相关心。
Tina有一个球,它的名字叫zball。zball很神奇,它每天会变大一些。在第一天,它和原始大小一样。 在第二天,它的大小将成为第一天的2倍。 在第n天,它的大小将为第(n-1)天大小的n倍。Tina想知道,zball在第n-1天时的大小对n取模是多少呢?
思路:
陶哲轩在他的书Solving mathematical problems 中提到威尔逊定理(n−1)!+1 (mod n)≡0⇔n" role="presentation" style="position: relative;">(n−1)!+1 (mod n)≡0⇔n(n−1)!+1 (mod n)≡0⇔n is prime.
首先,来回忆一下阶乘的定义:
m!=∏k=1mk=1×2×3×⋯×m." role="presentation" style="position: relative;">m!=∏mk=1k=1×2×3×⋯×m.m!=∏k=1mk=1×2×3×⋯×m.
可得出结论: 存在a, b ∈" role="presentation" style="position: relative;">∈∈ [1, m] 使得a⋅b" role="presentation" style="position: relative;">a⋅ba⋅b能整除m!
假定 m=n−1" role="presentation" style="position: relative;">m=n−1m=n−1,
原问题可分类如下:
- n是质数,则由威尔逊定理知:
(n−1)! (mod n)=−1(mod n)=n−1" role="presentation" style="position: relative;">(n−1)! (mod n)=−1(mod n)=n−1(n−1)! (mod n)=−1(mod n)=n−1. n是合数(composite),且n不能表示为质数的平方,则∃a,b" role="presentation" style="position: relative;">∃a,b∃a,b使得n=a⋅b | m!" role="presentation" style="position: relative;">n=a⋅b | m!n=a⋅b | m!,即
a⋅b=n | (n−1)!" role="presentation" style="position: relative;">a⋅b=n | (n−1)!a⋅b=n | (n−1)!n是合数,且n可表示成质数p的平方,而且 p > 2+1" role="presentation" style="position: relative;">2–√+12+1, 即 p≥3" role="presentation" style="position: relative;">p≥3p≥3
此时的目标是寻找a, b使得 a⋅b | p2" role="presentation" style="position: relative;">a⋅b | p2a⋅b | p2,不妨假设 a = k1⋅p" role="presentation" style="position: relative;">k1⋅pk1⋅p, b = k2⋅p" role="presentation" style="position: relative;">k2⋅pk2⋅p.
n=p2" role="presentation" style="position: relative;">n=p2n=p2, 则n的约数有1,p,p2" role="presentation" style="position: relative;">1,p,p21,p,p2.
下面用反证法来证明为何a、b均与p线性相关,如果a(≥1" role="presentation" style="position: relative;">≥1≥1)与p线性无关,则b=k⋅p2≥p2(k≥1)" role="presentation" style="position: relative;">b=k⋅p2≥p2(k≥1)b=k⋅p2≥p2(k≥1),而b≤m=n−1=p2−1" role="presentation" style="position: relative;">b≤m=n−1=p2−1b≤m=n−1=p2−1,矛盾。同理假设b与p线性无关也会出现同样的矛盾,因此a、b均与p线性相关。1≤a=k1⋅p<b=k2⋅p≤p2−1" role="presentation" style="position: relative;">1≤a=k1⋅p<b=k2⋅p≤p2−11≤a=k1⋅p<b=k2⋅p≤p2−1
让a尽量小, 则k1=1" role="presentation" style="position: relative;">k1=1k1=1, 令t=k2" role="presentation" style="position: relative;">t=k2t=k2, 于是b可表示为t⋅p" role="presentation" style="position: relative;">t⋅pt⋅p.
∴t⋅p≤p2−1" role="presentation" style="position: relative;">∴t⋅p≤p2−1∴t⋅p≤p2−1
解上述不等式可得 p≥t+t2+42=f(t) (t≥2)" role="presentation" style="position: relative;">p≥t+t2+4√2=f(t) (t≥2)p≥t+t2+42=f(t) (t≥2), 容易分析得f(t)是递增函数。
当t=2" role="presentation" style="position: relative;">t=2t=2时, p≥2+1" role="presentation" style="position: relative;">p≥2–√+1p≥2+1,即p∈[2+1,+∞)" role="presentation" style="position: relative;">p∈[2–√+1,+∞)p∈[2+1,+∞), 于是b=2⋅p" role="presentation" style="position: relative;">b=2⋅pb=2⋅p.
而当t>2" role="presentation" style="position: relative;">t>2t>2时,p的解集是上述区间的子集, 因此p的解集可取两者中范围较大者, 即[2+1,+∞)" role="presentation" style="position: relative;">[2–√+1,+∞)[2+1,+∞)。
由于p≥2+1" role="presentation" style="position: relative;">p≥2–√+1p≥2+1, 而 p∈Z" role="presentation" style="position: relative;">p∈Zp∈Z, 因而p≥3" role="presentation" style="position: relative;">p≥3p≥3.
因此
a⋅b=2⋅p2=2⋅n|(n−1)!" role="presentation" style="position: relative;">a⋅b=2⋅p2=2⋅n|(n−1)!a⋅b=2⋅p2=2⋅n|(n−1)!
故 (n-1)! (mod n) = 0n是合数,且n可表示成质数p的平方,而且 p < 2+1" role="presentation" style="position: relative;">2–√+12+1, 即 p = 2, n=4.
此时,无法找到满足条件的a和b,4∤3!=6" role="presentation" style="position: relative;">4∤3!=64∤3!=6.
已AC代码:
using System;
namespace hdoj_zball
{
public class Solution
{
public int Mod(int n)
{
if (IsPrime(n))
return n - 1;
if (n == 4)
return 2;
return 0;
}
public bool IsPrime(int m)
{
if (m < 2)
return false;
for (int i = 2; i * i <= m; i++)
{
if (m % i == 0)
return false;
}
return true;
}
}
class Program
{
static void Main(string[] args)
{
int n = int.Parse(Console.ReadLine());
while (n-- > 0)
{
string[] s = Console.ReadLine().Split();
int num = int.Parse(s[0]);
Solution sol = new Solution();
Console.WriteLine(sol.Mod(num));
}
}
}
}
Rank (C#):
Exe.Time | Exe.Memory |
---|---|
1185ms | 26908K |
Reference:
elementary number theory - If n≠4" role="presentation" style="position: relative;">n≠4n≠4 is composite, then n" role="presentation" style="position: relative;">nn divides (n−1)!" role="presentation" style="position: relative;">(n−1)!(n−1)!. - Mathematics Stack Exchange
https://math.stackexchange.com/questions/164852/if-n-ne-4-is-composite-then-n-divides-n-1
C#版 - HDUoj 5391 - Zball in Tina Town(素数) - 题解的更多相关文章
- (hdu)5391 Zball in Tina Town
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=5391 Problem Description Tina Town is a friendl ...
- HDU 5391 Zball in Tina Town【威尔逊定理】
<题目链接> Zball in Tina Town Problem Description Tina Town is a friendly place. People there care ...
- hdu 5391 Zball in Tina Town 威尔逊定理 数学
Zball in Tina Town Time Limit: 3000/1500 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Oth ...
- hdu 5391 Zball in Tina Town(打表找规律)
问题描述 Tina Town 是一个善良友好的地方,这里的每一个人都互相关心. Tina有一个球,它的名字叫zball.zball很神奇,它会每天变大.在第一天的时候,它会变大11倍.在第二天的时候, ...
- HDU 5391 Zball in Tina Town (打表,水)
题意: Tina有一个球,它的名字叫zball.zball很神奇,它会每天变大.在第一天的时候,它会变大1倍.在第二天的时候,它会变大2倍.在第n天的时候,它会变大n倍.zball原来的体积是1.Ti ...
- hdoj 5391 Zball in Tina Town
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5391 相关数论结论: 威尔逊定理——当且仅当p为素数时:( p -1 )! ≡ p-1 ( mod p ...
- HDU-5391 Zball in Tina Town
(n-1)!/n 就是如果n为素数,就等于n-1else为0. 求素数表: Zball in Tina Town Time Limit: 3000/1500 MS (Java/Others) Memo ...
- hdu5391 Zball in Tina Town(威尔逊定理)
转载请注明出处: http://www.cnblogs.com/fraud/ ——by fraud Zball in Tina Town Time Limit: 3000/1500 ...
- 判素数+找规律 BestCoder Round #51 (div.2) 1001 Zball in Tina Town
题目传送门 /* 题意: 求(n-1)! mod n 数论:没啥意思,打个表能发现规律,但坑点是4时要特判! */ /***************************************** ...
随机推荐
- notes for lxf(四)
类名首字母通常大写 创建实例 类名 +() __init__方法 创建实例时把一些属性绑上去 __init__方法第一参数永远是self 表示船舰的实例本身 类是实例的模板 实例是一个一个具体的对象 ...
- Metasploit运行环境内存不要低于2GB
Metasploit运行环境内存不要低于2GB Metasploit启用的时候,会占用大量的内存.如果所在系统剩余内存不足(非磁盘剩余空间),会直接导致运行出错.这种情况特别容易发生在虚拟机Kali ...
- go片段代码
关于枚举类型
- nodejs中的Buffer
一,开篇分析 所谓缓冲区Buffer,就是 "临时存贮区" 的意思,是暂时存放输入输出数据的一段内存. JS语言自身只有字符串数据类型,没有二进制数据类型,因此NodeJS提供了一 ...
- 深入理解CPP与C中bsearch函数的用法
·使用besearch函数的前提(一些废话) 首先让我们先亮出二分法的定义: https://baike.baidu.com/item/二分法/1364267 以及二分法实现的方法: https:// ...
- python3 实现对代码文件中注释的翻译
心血来潮,昨天看见群里讨论一段图片转pdf的代码,直接拿过来发现不能用,原来是因为代码中传的文件对象不对,源码中说传递的是一个文件路径或一个文件对象.他传的是一个文件名,很是尴尬. 想了想,主要原因还 ...
- vue 实现图片上传与预览,以及清除图片
vue写原生的上传图片并预览以及清除图片的效果,下面是demo,其中里面有vue获取input框value值的方法以及vue中函数之间的调用 <!DOCTYPE html> <htm ...
- Linux系统下zookeeper的安装和配置
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件.它是一个为分布式应用提供一致性服务的软件,提供的功 ...
- 我和python的初相识
认识Python是大二的选修 单纯只是想赚学分而已 后来觉得越来越有趣. 一.python简介 简单来说Python 是一个高层次的结合了解释性.编译性.互动性和面向对象的脚本语言.Python 的设 ...
- 20175324王陈峤宇 2018-2019-2《Java程序设计》结对编程项目-四则运算 第一周 阶段性总结
20175324王陈峤宇 2018-2019-2<Java程序设计>结对编程项目-四则运算 第一周 阶段性总结 需求分析 这次的结对作业是要求我们利用栈来设计一个计算器. 自动生成四则运算 ...