题目地址:https://codeforces.com/gym/101964/problem/B

题目:


给出表盘的时针、分针、秒针的长度A, B, C和表盘刻度数N,求时针、分针、秒针任意指向一个刻度,针点构成的包含圆心的三角形数目(包括圆心在三角形边上的情况)

解题思路:


为了简化问题,我们先考虑A=B=C的情况,其他情况就是在此基础上进行多重排列了。

(1)N为偶数

整个圆上的点都是对称的,固定一个点A,枚举另一个点B,可以确定C的可取点在A和B关于原点的对称点A'B'之间,包括边界上的点。为了避免重复,只枚举上半部分的A, 最终*2就是答案。

例如:N=10

枚举方法:令m=N/2-1

A在A,B在B/C/D/E,可以确定的三角形数为:2+3+4+5

A在B,B在C/D/E,可以确定的三角形数为:2+3+4

A在C,B在D/E,可以确定的三角形数为:2+3

A在D,B在E,可以确定的三角形数为:2

通过等差数列的求和公式和1^2+2^2+...+n^2=n(n+1)(2n+1)/6,可以推出公式:

(2)N为基数

和N为偶数的枚举思路基本一致,但是当N为基数时,除了在x轴上的一个点之外,其他的点是上下对称的,故x轴上点需要单独枚举,其他的只需要枚举上半部分的点。

例如N=7:

枚举方法:令m=N/2

A在A点,B在B/C/D点,可以确定的三角形数为:1+2+3

A在B点,B在C/D点,可以确定的三角形数为:1+2

A在C点,B在D点,可以确定的三角形数为:1

通过等差数列的求和公式和1^2+2^2+...+n^2=n(n+1)(2n+1)/6,可以推出公式:

当三条边是ABC类型的,ans=ans*6;当三条边是AAB类型的,ans=ans*3

注意:答案要对2^64取模,相当于自然溢出,可以用unsigned long long ,但是在计算ans的分子是自然溢出之后的值会小于分母,用逆元的话又有些麻烦,既然ans为正数,可以先用分子一点点把分母消掉再乘起来。(或者直接用java写)

ac代码:


c++

#include <iostream>
#include <math.h>
using namespace std;
typedef unsigned long long ll;
ll A, B, C, N;
int judge()
{if(A == B && B == C) return 3;else if(A != B && B != C) return 1;else return 2;
}
ll gcd(ll a, ll b)
{return b == 0 ? a : gcd(b, a%b);
}
int main()
{cin >> A >> B >> C >> N;if(N == 2) printf("0");else{int e = judge();ll m = N / 2, ans;if(N%2 == 0){m--;ll a = m, b = m+1, c = m+5;if(a%3 == 0) a /= 3;else if(b%3 == 0)  b /= 3;else if(c%3 == 0) c /= 3;ans = a * b * c;}else{ll a = m, b = m+1, c = 2*m+1, mul = 1;ll ga = gcd(a, 6), gb = gcd(b, 6), gc = gcd(c, 6);if(ga != 1 && mul != 6) a /= ga, mul *= ga;if(gb != 1 && mul != 6) b /= gb, mul *= gb;if(gc != 1 && mul != 6) c /= gc, mul *= gc;ans = a * b * c;}if(e == 1)ans = ans * 6;else if(e == 2)ans = ans * 3;cout << ans;}return 0;
}

JAVA:

import java.math.BigInteger;
import java.util.*;
public class Main
{public static void main(String[] args){Scanner input = new Scanner(System.in);BigInteger A = input.nextBigInteger();BigInteger B = input.nextBigInteger();BigInteger C = input.nextBigInteger();BigInteger N = input.nextBigInteger();BigInteger x1 = new BigInteger("1");BigInteger x2 = new BigInteger("2");BigInteger x5 = new BigInteger("5");BigInteger x3 = new BigInteger("3");BigInteger x6 = new BigInteger("6");BigInteger x0 = new BigInteger("0");BigInteger MOD = x2.pow(64);BigInteger ans;int e = 0;if(A.equals( B) && B.equals(C))  e = 3;else if(!A.equals(B) && !B.equals(C) && !A.equals(C)) e = 1;else e = 2;BigInteger m = N.divide(x2);if((N.mod(x2)).equals(x0)){m = m.subtract(x1);BigInteger a = m; BigInteger b = m.add(x1);BigInteger c = m.add(x5);ans =  a.multiply(b).multiply(c).divide(x3);}else{BigInteger a = m;BigInteger b = m.add(x1); BigInteger c = m.multiply(x2).add(x1);ans = a.multiply(b).multiply(c).divide(x6);}if(e == 2) ans = ans.multiply(x3);else if(e == 1) ans = ans.multiply(x6);System.out.print(ans.mod(MOD));}
}

【CF-gym101964:B】Broken Watch(找规律+推导+自然溢出/java大数)相关推荐

  1. [国家集训队]整数的lqp拆分 数学推导 打表找规律

    题解: 考场上靠打表找规律切的题,不过严谨的数学推导才是本题精妙所在: 求:$\sum\prod_{i=1}^{m}F_{a{i}}$ 设 $f(i)$ 为 $N=i$ 时的答案,$F_{i}$ 为斐 ...

  2. cf:C. Restoring the Duration of Tasks【找规律】

    分析 根据当前任务的结束时间和下一个任务的开始时间得到一个分类即可 ac code for _ in range(int(input())):n = int(input())s = list(map( ...

  3. 1235813找规律第100个数_2013年全国中考数学规律探索试题汇编

    由莲山课件提供http://www.5ykj.com/ 资源全部免费(2013•衡阳)观察下列按顺序排列的等式:,,,,-,试猜想第n个等式(n为正整数):an= ﹣ .考点:规律型:数字的变化类. ...

  4. 笔试逻辑智力题找规律题总结1

    1.     3,3/2,1,3/4,(),1/2 解析:分子为3,分母为项数         3/1,3/2,3/3,3/4,3/5,3/6 答案:3/5   2.    3/2,5/8,7/24, ...

  5. codeforces:C. Another Array Problem【分类讨论 + 找规律】

    目录 题目截图 题目分析 ac code 总结 题目截图 题目分析 做cf题目别老想着套算法模版 找规律才是正道,这就是所谓的「思维」 n = 2很简单 n >= 4: # 肯定有一个最大值,不 ...

  6. 【找规律+公式推导+切西瓜问题】HDU-1290 献给杭电五十周年校庆的礼物

    注解 1.找规律,推导公式.这类问题的一般技巧:二维的一般是a_{n} ^ 2+b_{n}+c,三维的一般是a_{n} ^ 3 + b_{n} ^ 2 + c_{n} + d. 2.利用上面的通式,只 ...

  7. 2018.09.01 poj3071Football(概率dp+二进制找规律)

    传送门 概率dp简单题. 设f[i][j]表示前i轮j获胜的概率. 如果j,k能够刚好在第i轮相遇,找规律可以发现j,k满足: (j−1)>>(i−1)(j−1)>>(i−1) ...

  8. 点分治问题 ----------- P3727 曼哈顿计划E[点分治+博弈SG函数打表找规律]

    题目链接 解题思路: 1.首先对于每个操作我们实际上是一个博弈问题 对于k=1的操作就是很基础的NIM游戏就是找到一条链的异或和为0 对于k=2的操作通过达打表找规律: 如果s是奇数那么偶数的SG函数 ...

  9. 数学/找规律/sgu 118 Digital root

    题意 定义f(n)为n各位数字之和,如果n是各位数,则n个数根是f(n),否则为f(n)的数根 现在给出n个Ai,求出A1*A2*-*AN + A1*A2*-*AN-1 + - + A1*A2 + A ...

  10. HDU 5703 Desert 水题 找规律

    HDU 5703 Desert 水题 找规律 已知有n个单位的水,问有几种方式把这些水喝完,每天至少喝1个单位的水,而且每天喝的水的单位为整数.看上去挺复杂要跑循环,但其实上,列举几种情况之后就会发现 ...

最新文章

  1. 代码跑得慢?分分钟教你如何给代码提速30%!!!
  2. 进程与线程的超级简单形象解释
  3. Linux 命令之 lsusb -- 显示本机的USB设备列表信息
  4. 租用境外服务器开设网站,租用境外服务器对网站SEO有影响么?影响在那里?
  5. 2015.12.21 内存管理(memory management)
  6. Android 10.0修改系统型号(Build.MODEL)
  7. iOS 应用下载链接获取
  8. JAFFE表情库介绍
  9. 解决make: *** [install-recursive] Error 1问题
  10. 创维电视能用鸿蒙系统吗,鸿蒙OS系统电视怎么看直播?装了鸿蒙系统的电视可以看电视直播吗?当然可以...
  11. VS2005中(_CRT_SECURE_NO_DEPRECATE)警告
  12. vue2知识点:数据代理
  13. 仿抖音视频详情页点赞红心动效
  14. 错误跳转html页面模板,404错误页面模板代码大全 - 搜外SEO问答
  15. 人工智能、深度学习、机器学习常见面试题83~100
  16. Cesium中Primitive与Entity详细介绍
  17. win7无线热点_智能手机变成台式电脑的无线网卡来使用并连接WIFI上网的方法
  18. 推流端、服务端、播放端
  19. zend studio php 错误提示,如何解决Win7打开启动ZendStudio PHP时提示错误
  20. 3ds Max 2016怎样设置中文界面?

热门文章

  1. php创建文件目录,及删除目录和文件
  2. 数据更新(2020-4-1)
  3. lvds传输距离标准_电平标准整理
  4. 计算机系统通过执行通道程序完成数据,计算机系统结构_第四章练习 答案
  5. echart legends换行固定数量显示
  6. 【转】C#中Json和类的相互转化
  7. C# Dictionary 的几种遍历方法
  8. GridView 中取值的方法汇总
  9. MyCAT与MySQL导入、导出文件
  10. WAN killer