打卡信奥刷题(2945)用C++实现信奥题 P5864 [SEERC 2018] Broken Watch
P5864 [SEERC 2018] Broken Watch
题目描述
一架 UFO 坠毁在地球上。外星人船长幸免于难,但他的手表没能逃过这一劫。
外星人的手表和人类的手表非常相似:手表有一个直径为30 mm\text{30 mm}30 mm的表盘,有三个表针,长度分别为A,BA, BA,B和C (1000≤A,B,C≤15000)C \ (1000 \leq A, B, C \leq 15000)C(1000≤A,B,C≤15000)微米。然而,外星人有不同的时间单位:111分钟里有N (2≤N<232)N \ (2 \leq N < 2^{32})N(2≤N<232)秒。因此,表盘的边缘上有NNN个刻度而不是606060个。
手表的玻璃面板已经摔碎,表针也松了:它们可以独立地自由旋转。让三个表针分别指向任意刻度,以表针的尖端的顶点可以构成一个三角形(表针不共线的前提下)。
在救援来之前外星人闲着没事干,就思考起了这样一个问题:按上述方法构成的三角形中,有多少个三角形包含了表盘的中心(答案记为MMM)。(表盘中心在三角形的某一边上的三角形也要统计。)
输入格式
仅一行包含整数A,B,CA, B, CA,B,C和NNN,四个数字之间用一个半角空格隔开。
输出格式
输出M mod 264M \bmod 2^{64}Mmod264的值。
输入输出样例 #1
输入 #1
15000 15000 15000 2输出 #1
0输入输出样例 #2
输入 #2
5000 10000 15000 3输出 #2
6输入输出样例 #3
输入 #3
15000 15000 15000 3输出 #3
1输入输出样例 #4
输入 #4
15000 15000 15000 4输出 #4
4输入输出样例 #5
输入 #5
15000 15000 15000 5输出 #5
5输入输出样例 #6
输入 #6
15000 15000 15000 6输出 #6
14C++实现
#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#defineullunsignedlonglongusingnamespacestd;#definech()getchar()#definepc(x)putchar(x)template<typenameT>inlinevoidread(T&x){intf;charc;for(f=1,c=ch();c<'0'||c>'9';c=ch())if(c=='-')f=-f;for(x=0;c<='9'&&c>='0';c=ch())x=x*10+(c&15);x*=f;}template<typenameT>inlinevoidwrite(T x){staticcharq[64];intcnt=0;if(!x)pc('0');if(x<0)pc('-'),x=-x;while(x)q[cnt++]=x%10+'0',x/=10;while(cnt--)pc(q[cnt]);}intmain(){ull A,B,C,N;read(A),read(B),read(C),read(N);if(N==2)puts("0");else{ull cnt=(A==B)+(B==C)+(A==C);cnt=(cnt==3?1:cnt==1?3:6);if(N&1){N=(N+1)>>1;A=N-1,B=N,C=N*2-1;if(A&1)B>>=1;elseA>>=1;}else{N=N>>1;A=N-1,B=N,C=N+4;}if(A%3==0)A/=3;elseif(B%3==0)B/=3;elseC/=3;write(A*B*C*cnt),pc('\n');}return0;}后续
接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容
