bestcoder#51

A题:

求(n-1)!%n。

显然,若n不是素数,n的因子全都存在于1~n-1中,因此(n-1)!%n=0. (n=4时除外)

若n为素数,由威尔逊定理: (n,p互质-> (n-1)!=1(mod p)) ,(n-1)!%n=1。

打表也可以发现规律,注意n=4的时候答案为2的特判。

注意判素数时先筛出素数,在由筛出的素数去判断一个数是否为素数。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<vector>
#include<stack>
#include<queue>
#include<set>
#include<map>
#include<string>
#include<math.h>
#include<cctype>
#define ll long long
#define REP(i,a,b) for(int (i)=(a);(i)<=(b);(i)++)
#define REPP(i,a,b,t) for(int (i)=(a);(i)<=(b);(i)+=(t))
#define rep(i,a,b) for(int (i)=(a);(i)>=(b);(i)--)
#define repp(i,a,b,t) for(int (i)=(a);(i)>=(b);(i)-=(t))
#define PII pair<int,int>
#define fst first
#define snd second
#define MP make_pair
#define PB push_back
#define RI(x) scanf("%d",&(x))
#define RII(x,y) scanf("%d%d",&(x),&(y))
#define RIII(x,y,z) scanf("%d%d%d",&(x),&(y),&(z))
#define DRI(x) int (x);scanf("%d",&(x))
#define DRII(x,y) int (x),(y);scanf("%d%d",&(x),&(y))
#define DRIII(x,y,z) int (x),(y),(z);scanf("%d%d%d",&(x),&(y),&(z))
#define RS(x) scanf("%s",x)
#define RSS(x,y) scanf("%s%s",x,y)
#define DRS(x) char x[maxn];scanf("%s",x)
#define DRSS(x,y) char x[maxn],y[maxn];scanf("%s%s",x,y)
#define MS0(a) memset((a),0,sizeof((a)))
#define MS1(a) memset((a),-1,sizeof((a)))
#define MS(a,b) memset((a),(b),sizeof((a)))
#define ALL(v) v.begin(),v.end()
#define SZ(v) (int)(v).size()using namespace std;const int maxn=1000100;
const int INF=(1<<29);
const double EPS=0.0000000001;
const double Pi=acos(-1.0);ll n;bool isprime[maxn];
vector<ll> prime;void getP()
{MS(isprime,1);isprime[1]=0;REP(i,2,maxn-1){if(!isprime[i]) continue;REPP(j,i+i,maxn-1,i) isprime[j]=0;}REP(i,1,maxn-1){if(isprime[i]) prime.PB(i);}
}bool isp(ll n)
{int sz=SZ(prime);for(ll i=0;i<sz&&prime[i]*prime[i]<=n;i++){if(n%prime[i]==0) return 0;}return 1;
}int main()
{// freopen("in.txt","r",stdin);
    DRI(T);// Init();
    getP();while(T--){scanf("%I64d",&n);if(isp(n)) printf("%I64d\n",n-1);else if(n==4) puts("2");else puts("0");}return 0;
}

View Code

B题:

给出一个置换,求它的循环长度。

分解成循环求长度的最小公倍数。注意由于要取模,lcm不能用a*b/gcd(a,b)=a*b*inv(gcd(a,b))求,因为a和b已经被取模过,gcd(a,b)!=gcd(a%p,b%p)。

lcm的另一种求法:分解质因数。

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
#include<vector>
#include<stack>
#include<queue>
#include<set>
#include<map>
#include<string>
#include<math.h>
#include<cctype>
#include<memory>
#define ll long long
#define REP(i,a,b) for(int (i)=(a);(i)<=(b);(i)++)
#define REPP(i,a,b,t) for(int (i)=(a);(i)<=(b);(i)+=(t))
#define MS0(a) memset((a),0,sizeof((a)))
#define SZ(v) (int)(v).size()
#pragma comment(linker, "/STACK:16777216")using namespace std;const int maxn=3000100;
const int INF=(1<<29);
const double EPS=0.0000000001;
const double Pi=acos(-1.0);const ll MOD=3221225473;
int n;
int a[maxn];
bool vis[maxn];#define MAXN 100010
bool isprime[MAXN];
int prime[MAXN],sz;
void getPrime()
{memset(isprime,1,sizeof(isprime));isprime[1]=0;REP(i,1,MAXN-1){if(!isprime[i]) continue;REPP(j,i+i,MAXN-1,i) isprime[j]=0;}sz=0;REP(i,2,MAXN-1){if(isprime[i]) prime[sz++]=i;}
}ll qpow(ll n,ll k,ll p)
{ll res=1;while(k){if(k&1) res=(res*(n%p))%p;n=(n*n)%p;k>>=1;}return res;
}ll lcm(ll a,ll b)
{ll res=1;a%=MOD,b%=MOD;REP(i,0,sz-1){int t=prime[i];if(a%t&&b%t) continue;if(t*t>a&&t*t>b) break;int cntA=0,cntB=0;while(a%t==0) a/=t,cntA++;while(b%t==0) b/=t,cntB++;ll cnt=max(cntA,cntB);res=(res*qpow(t,cnt,MOD))%MOD;}if(a!=1) res=(res*a)%MOD;if(b!=1) res=(res*b)%MOD;return res;
}int main()
{freopen("in.txt","r",stdin);getPrime();int T;cin>>T;while(T--){scanf("%d",&n);REP(i,1,n) scanf("%d",&a[i]);ll ans=1;MS0(vis);REP(i,1,n){if(!vis[i]){vis[i]=1;ll tmp=1;for(int j=a[i];j!=i;j=a[j]){tmp++;vis[j]=1;}ans=lcm(ans,tmp)%MOD;}}printf("%lld\n",ans%MOD);}return 0;
}

View Code

转载于:https://www.cnblogs.com/--560/p/4733995.html

bestcoder#51相关推荐

  1. BestCoder 2nd Anniversary

    http://acm.hdu.edu.cn/search.php?field=problem&key=BestCoder+2nd+Anniversary&source=1&se ...

  2. 矩阵快速幂---BestCoder Round#8 1002

    当要求递推数列的第n项且n很大时,怎么快速求得第n项呢? 可以用矩阵快速幂来加速计算. 我们可以用矩阵来表示数列递推公式 比如fibonacci数列 可以表示为 [f(n)   f(n-1)] = [ ...

  3. BestCoder Round #29 1003 (hdu 5172) GTY's gay friends [线段树 判不同 预处理 好题]

    传送门 GTY's gay friends Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Ot ...

  4. BestCoder Round #68 (div.2) 1002 tree

    题意:给你一个图,每条边权值0或1,问每个点周围最近的点有多少个? 思路:并查集找权值为0的点构成的连通块. 1 #include<stdio.h> 2 #include<strin ...

  5. BestCoder Round #92 比赛记录

    上午考完试后看到了晚上的BestCoder比赛,全机房都来参加 感觉压力好大啊QAQ,要被虐了. 7:00 比赛开始了,迅速点进了T1 大呼这好水啊!告诉了同桌怎么看中文题面 然后就开始码码码,4分1 ...

  6. 浅谈几种区块链网络攻击以及防御方案之51#37攻击

    旧博文,搬到 csdn 原文:http://rebootcat.com/2020/04/11/network_attack_of_blockchain_51_attack/ 写在前面的话 自比特币诞生 ...

  7. BestCoder 1st Anniversary ($) 1002.Hidden String

    Hidden String Accepts: 437 Submissions: 2174 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 26 ...

  8. 51单片机实现对24C02进行页写、顺序读取并显示验证

    源:51单片机实现对24C02进行页写.顺序读取并显示验证 //******************************************************************** ...

  9. Android API 中文 (51) —— ZoomButtonsController

    一.结构 public class ZoomButtonsController extends View implements View.OnTouchListener java.lang.Objec ...

最新文章

  1. golang的makefile编写
  2. 2星|《深度模仿》:陷入锤子模式,案例太少,洞察力欠缺
  3. 我对“POST和GET的区别”的理解
  4. 模拟游戏给我带来的产品思维
  5. 微信十年,领取纪念勋章头像!
  6. 软件变更控制 - 控制成本溢出
  7. Eclipse中配置CORBA环境
  8. c++ 开发虚拟摄像头_开发板有了,但我们要怎么玩?
  9. 目前3个最受欢迎的免费、开源文件加密软件评测
  10. MyBatis防止SQL注入的方法
  11. 将文件夹下的多个文件的内容合并到一个文件中
  12. 阿里 P7 前端高级工程师,都需要掌握哪些技术栈?
  13. sd卡数据丢失怎么恢复?
  14. JavaScript 学习笔记(八)前后端交互;Ajax进行前后端交互
  15. MySQL引擎和区别
  16. [附源码]Nodejs计算机毕业设计基于JAVA的校园电车租赁系统Express(程序+LW)
  17. 买天猫网店转让怎么变更资料
  18. 【源代码】一键分享各个社交平台_android
  19. linux下修改ext3硬盘为nst,Linux系统备份与恢复
  20. JavaScript-Ajax

热门文章

  1. RequestResponse总结
  2. 装箱与拆箱及其性能损失问题
  3. SqlHelper全攻略
  4. 【新番前线】2009年公开剧场版动画汇总
  5. Handler消息机制(二):一个线程有几个Handler
  6. 騰訊大廈有39層的問題解決方案。
  7. android 应用启动不了,不能断点
  8. java 获取聚合vo_NC57聚合VO写法
  9. IOS开发笔记5-C语言基础复习
  10. PHP学习笔记-字符串操作2