HDOJ 5391 Zball in Tina Town

来源:互联网 发布:2017理财软件排行 编辑:程序博客网 时间:2024/04/30 10:30

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5391

题意:给你一个n,问你(n-1)! % n的值。

此题用到的是一个威尔逊定理,威尔逊定理的内容是说如果n是素数,那么一定存在(n-1)! % n == -1,其实如果比较机智知道打表的同学应该也能看出这个规律,那么小编这里证明一下这个威尔逊定理,首先在这个MOD n的乘法中,一共有n-1个元素,如果n为素数,那么每一个元素一定存在一个逆元,那思考,如果每元素都有逆元那么两两配对结果不应该是1吗……当然还得考虑没有办法两两配对的,那就是逆元就是其本身的,x^2 MOD n = 1, 解得x = 1或者x = n-1,那么我们在阶层中除了这两个特殊的刚刚好可以两两配对,又因为(n-1)%n == n-1,所以结果就是n-1。

那么素数就解决了,我们再看非素数,仔细想,如果存在一个因子x,那么x * (n/x) == n,所以如果是一个非素数,那么一定存在两个因子,使得其积为n,那么整个阶层就一定是n的倍数了,所以答案就为0了。但是真的每一个非素数都是这样的吗?当然我们还得考虑特殊情况,那就是只存在一个因子x,且x^2 == n,这种明显就不能构成n的倍数,解出来这个值为4。

所以这道题我们只需要判断是否是素数,如果是非素数再特判一下4就好了。

#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;#define LL __int64int prime(int n){for(int i=2; i*i<=n; i++)if(n % i == 0)return 0;return 1;}int main(){int T;scanf("%d",&T);while(T--){int n;scanf("%d",&n);if(n == 4) printf("2\n");else if(!prime(n)) printf("0\n");else printf("%d\n",n-1);}}


0 0
原创粉丝点击