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 中提到威尔逊定理(n1)!+1 (mod n)0n(n−1)!+1 (mod n)≡0⇔n is prime.

首先,来回忆一下阶乘的定义:
m!=mk=1k=1×2×3××m.m!=∏k=1mk=1×2×3×⋯×m.

可得出结论: 存在a, b [1, m] 使得aba⋅b能整除m!

假定 m=n1m=n−1,

原问题可分类如下:

  1. n是质数,则由威尔逊定理知:
    (n1)! (mod n)=1(mod n)=n1(n−1)! (mod n)=−1(mod n)=n−1.
  2. n是合数(composite),且n不能表示为质数的平方,则a,b∃a,b使得n=ab | m!n=a⋅b | m!,即
    ab=n | (n1)!a⋅b=n | (n−1)!

  3. n是合数,且n可表示成质数p的平方,而且 p > 2+12+1, 即 p3p≥3
    此时的目标是寻找a, b使得 ab | p2a⋅b | p2,不妨假设 a = k1pk1⋅p, b = k2pk2⋅p.
    n=p2n=p2, 则n的约数有1,p,p21,p,p2.
    下面用反证法来证明为何a、b均与p线性相关,如果a(1≥1)与p线性无关,则b=kp2p2(k1)b=k⋅p2≥p2(k≥1),而bm=n1=p21b≤m=n−1=p2−1,矛盾。同理假设b与p线性无关也会出现同样的矛盾,因此a、b均与p线性相关。

    1a=k1p<b=k2pp211≤a=k1⋅p<b=k2⋅p≤p2−1
    让a尽量小, 则k1=1k1=1, 令t=k2t=k2, 于是b可表示为tpt⋅p.
    tpp21∴t⋅p≤p2−1
    解上述不等式可得 pt+t2+42=f(t) (t2)p≥t+t2+42=f(t) (t≥2), 容易分析得f(t)是递增函数。
    t=2t=2时, p2+1p≥2+1,即p[2+1,+)p∈[2+1,+∞), 于是b=2pb=2⋅p.
    而当t>2t>2时,p的解集是上述区间的子集, 因此p的解集可取两者中范围较大者, 即[2+1,+)[2+1,+∞)
    由于p2+1p≥2+1, 而 pZp∈Z, 因而p3p≥3.
    因此
    ab=2p2=2n|(n1)!a⋅b=2⋅p2=2⋅n|(n−1)!
    故 (n-1)! (mod n) = 0

  4. n是合数,且n可表示成质数p的平方,而且 p < 2+12+1, 即 p = 2, n=4.
    此时,无法找到满足条件的a和b,43!=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.TimeExe.Memory
1185ms26908K

Reference:
elementary number theory - If n4n≠4 is composite, then nn divides (n1)!(n−1)!. - Mathematics Stack Exchange
https://math.stackexchange.com/questions/164852/if-n-ne-4-is-composite-then-n-divides-n-1

转载于:https://www.cnblogs.com/enjoy233/p/10408663.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值