bestcoder#51
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相关推荐
- BestCoder 2nd Anniversary
http://acm.hdu.edu.cn/search.php?field=problem&key=BestCoder+2nd+Anniversary&source=1&se ...
- 矩阵快速幂---BestCoder Round#8 1002
当要求递推数列的第n项且n很大时,怎么快速求得第n项呢? 可以用矩阵快速幂来加速计算. 我们可以用矩阵来表示数列递推公式 比如fibonacci数列 可以表示为 [f(n) f(n-1)] = [ ...
- 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 ...
- BestCoder Round #68 (div.2) 1002 tree
题意:给你一个图,每条边权值0或1,问每个点周围最近的点有多少个? 思路:并查集找权值为0的点构成的连通块. 1 #include<stdio.h> 2 #include<strin ...
- BestCoder Round #92 比赛记录
上午考完试后看到了晚上的BestCoder比赛,全机房都来参加 感觉压力好大啊QAQ,要被虐了. 7:00 比赛开始了,迅速点进了T1 大呼这好水啊!告诉了同桌怎么看中文题面 然后就开始码码码,4分1 ...
- 浅谈几种区块链网络攻击以及防御方案之51#37攻击
旧博文,搬到 csdn 原文:http://rebootcat.com/2020/04/11/network_attack_of_blockchain_51_attack/ 写在前面的话 自比特币诞生 ...
- BestCoder 1st Anniversary ($) 1002.Hidden String
Hidden String Accepts: 437 Submissions: 2174 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 26 ...
- 51单片机实现对24C02进行页写、顺序读取并显示验证
源:51单片机实现对24C02进行页写.顺序读取并显示验证 //******************************************************************** ...
- Android API 中文 (51) —— ZoomButtonsController
一.结构 public class ZoomButtonsController extends View implements View.OnTouchListener java.lang.Objec ...
最新文章
- golang的makefile编写
- 2星|《深度模仿》:陷入锤子模式,案例太少,洞察力欠缺
- 我对“POST和GET的区别”的理解
- 模拟游戏给我带来的产品思维
- 微信十年,领取纪念勋章头像!
- 软件变更控制 - 控制成本溢出
- Eclipse中配置CORBA环境
- c++ 开发虚拟摄像头_开发板有了,但我们要怎么玩?
- 目前3个最受欢迎的免费、开源文件加密软件评测
- MyBatis防止SQL注入的方法
- 将文件夹下的多个文件的内容合并到一个文件中
- 阿里 P7 前端高级工程师,都需要掌握哪些技术栈?
- sd卡数据丢失怎么恢复?
- JavaScript 学习笔记(八)前后端交互;Ajax进行前后端交互
- MySQL引擎和区别
- [附源码]Nodejs计算机毕业设计基于JAVA的校园电车租赁系统Express(程序+LW)
- 买天猫网店转让怎么变更资料
- 【源代码】一键分享各个社交平台_android
- linux下修改ext3硬盘为nst,Linux系统备份与恢复
- JavaScript-Ajax