题意:

有三个二次函数,分别是$x^2 + a_1x + b_1$, $x^2 + a_2x + b_2$, $x^2 + a_3x + b_3$

现在要找三个整数$x_1, x_2, x_3$, 使得三个函数值中至少有两个相等。

思路:

主要的难点是要找三个整数。

Camp时候洪老师说的平移啥啥的,理解不了......

看了网上另一个题解的思路。

假设两个二次函数相等的函数值是$y$, 并假设是第一个和第二个相等

那么我们可以知道$x_1 =- \frac{a_1 + \sqrt{a_1^2 - 4(b_1 - y)}}{2}, x_2 =- \frac{a_2 + \sqrt{a_2^2 - 4(b_2 - y)}}{2}$

令$T^2 = a_1^2 - 4(b_1 - y), t^2 = a_2^2 - 4(b_2 - y)$

可以得到$T^2 - t^2 = a_1^2 - 4b_1 - a_2^2 + 4b_2 = (T+t)(T-t)$

于是我们进行因式分解,枚举$T^2-t^2$的因子,判断得到的$x_1, x_2$是否为整数。

对于$T^2-t^2$为0和1时进行特判就行了。

对于每一对$a$和$b$,判断是否有这样两个整数解。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<algorithm>
  4. #include<cstring>
  5. #include<queue>
  6. #include<stack>
  7. #include<set>
  8. #include<vector>
  9. #include<cmath>
  10.  
  11. using namespace std;
  12. typedef long long LL;
  13.  
  14. LL a[], b[];
  15. int t;
  16. LL ans1, ans2;
  17.  
  18. bool solve(LL a1, LL b1, LL a2, LL b2)
  19. {
  20. int sub = abs(a1 * a1 - * b1 - a2 * a2 + * b2);
  21. if(sub == ){
  22. if((a1 - a2) % == ){
  23. ans1 = ;
  24. ans2 = (a1 - a2) / ;
  25. return true;
  26. }
  27. else return false;
  28. }
  29. else if(sub == ){
  30. if(a1 % != a2 % ){
  31. if(a1 * a1 - * b1 > a2 * a2 - * b2 && a1 % ){
  32. ans1 = ( - a1) / ;
  33. ans2 = -a2 / ;
  34. return true;
  35. }
  36. else if(a1 * a1 - * b1 < a2 * a2 - * b2 && a2 % ){
  37. ans2 = ( - a2) / ;
  38. ans1 = -a1 / ;
  39. return true;
  40. }
  41. else return false;
  42. }
  43. return false;
  44. }
  45. else{
  46. for(int i = ; i * i < sub; i++){
  47. if(!(sub % i) && !((sub / i + i) % ) && !((i - sub / i) % )){
  48. LL T = (sub / i + i) / ;
  49. LL t = (i - sub / i) / ;
  50. if(a1 * a1 - * b1 < a2 * a2 - * b2)swap(T, t);
  51. if(!((T + a1) % ) && !((t + a2) % )){
  52. ans1 = -(a1 + T) / ;
  53. ans2 = -(a2 + t) / ;
  54. return true;
  55. }
  56. }
  57. }
  58. return false;
  59. }
  60. }
  61.  
  62. void work()
  63. {
  64. for(int i = ; i < ; i++){
  65. for(int j = i + ; j < ; j++){
  66. if(solve(a[i], b[i], a[j], b[j])){
  67. if(i == )
  68. {
  69. printf("%lld %lld %lld\n", ans1, j == ?ans2:, j==?:ans2);
  70. //return;
  71. }
  72. else{
  73. printf("0 %lld %lld\n", ans1, ans2);
  74. //return ;
  75. }
  76. return;
  77. }
  78. }
  79. }
  80. }
  81.  
  82. int main()
  83. {
  84. scanf("%d", &t);
  85. while(t--){
  86. for(int i = ; i < ; i++){
  87. scanf("%lld%lld", &a[i], &b[i]);
  88. }
  89. work();
  90. }
  91.  
  92. return ;
  93. }

CCPC-Wannafly Winter Camp Day7 D---二次函数【数论】【构造】的更多相关文章

  1. 2020 CCPC Wannafly Winter Camp Day1 C. 染色图

    2020 CCPC Wannafly Winter Camp Day1 C. 染色图 定义一张无向图 G=⟨V,E⟩ 是 k 可染色的当且仅当存在函数 f:V↦{1,2,⋯,k} 满足对于 G 中的任 ...

  2. CCPC Wannafly Winter Camp Div2 部分题解

    Day 1, Div 2, Prob. B - 吃豆豆 题目大意 wls有一个\(n\)行\(m\)列的棋盘,对于第\(i\)行第\(j\)列的格子,每过\(T[i][j]\)秒会在上面出现一个糖果, ...

  3. 2020 CCPC Wannafly Winter Camp Day1 Div.1&amp F

    #include<bits/stdc++.h> #define forn(i, n) for (int i = 0; i < int(n); i++) #define fore(i, ...

  4. 2020 CCPC Wannafly Winter Camp Day1 - I. K小数查询(分块)

    题目链接:K小数查询 题意:给你一个长度为$n$序列$A$,有$m$个操作,操作分为两种: 输入$x,y,c$,表示对$i\in[x,y] $,令$A_{i}=min(A_{i},c)$ 输入$x,y ...

  5. 2020 CCPC Wannafly Winter Camp Day2-K-破忒头的匿名信

    题目传送门 sol:先通过AC自动机构建字典,用$dp[i]$表示长串前$i$位的最小代价,若有一个单词$s$是长串的前$i$项的后缀,那么可以用$dp[i - len(s)] + val(s)$转移 ...

  6. 2020 CCPC Wannafly Winter Camp Day1-F-乘法

    题目传送门 sol:二分答案$K$,算大于$K$的乘积有多少个.关键在于怎么算这个个数,官方题解上给出的复杂度是$O(nlogn)$,那么计算个数的复杂度是$O(n)$的.感觉写着有点困难,自己写了一 ...

  7. 2019 wannafly winter camp

    2019 wannafly winter camp Name Rank Solved A B C D E F G H I J K day1 9 5/11 O O O O O day2 5 3/11 O ...

  8. 2019 wannafly winter camp day 3

    2019 wannafly winter camp day 3 J 操作S等价于将S串取反,然后依次遍历取反后的串,每次加入新字符a,当前的串是T,那么这次操作之后的串就是TaT.这是第一次转化. 涉 ...

  9. 线段树优化建图(cf787d, 2019Wannafly Winter Camp Day7 Div1 E)

    线段树优化建图,用于区间到区间建边时降低空间复杂度 建立两颗线段树,一颗in, 代表进入这个区间,一颗out,代表从这个区间出去 in树从父亲向儿子建边,代表宏观进入整个区间,不向下寻找 out树从儿 ...

随机推荐

  1. gdb 拾遗

    1,跳过某个特定信号 (gdb) handle SIGPIPE nostop noprint pass 2,break在特定的系统调用处 (gdb) catch syscall 3 3,遇到一个断点的 ...

  2. IDEA使用笔记(四)——工具栏的显示隐藏切换

    这也是在玩快捷键的时候,自己试验出来的,觉得不常用但是一旦想用了可能一下不知道怎么弄,还需要找,不如记下来,起码能加深一下印象!

  3. imp-oracle10g数据库dmp导入到11g数据库提示IMP-00058,表或试图不存在

    拿了一份从10g数据库导出的dmp,本机安装的是11.2g的oracle数据库,执行imp导入后提示: IMP-00058: 遇到 ORACLE 错误 942ORA-00942: 表或视图不存在 开始 ...

  4. iptabes一条指令开放多个端口

    开放某个范围段内的端口: -A INPUT -p tcp -m state --state NEW -m tcp --dport 9001:9009 -j ACCEPT 开放多个不连续的端口: -A ...

  5. 执行一条SQL语句,插入多条数据!

    insert into blog (bid, aid) values (2,1)(2,2)(2,3)

  6. 关于Stm32定时器+ADC+DMA进行AD采样的实现

    Stm32的ADC有DMA功能这都毋庸置疑,也是我们用的最多的!然而,如果我们要对一个信号(比如脉搏信号)进行定时采样(也就是隔一段时间,比如说2ms),有三种方法: 1.使用定时器中断每隔一定时间进 ...

  7. 教你一招:笔记本安装mint18时,安装界面显示不全

    近日在给自己的笔记本安装mint18时,安装界面显示不全,就是安装时到了分区界面后看不到下一步. 很无奈.... 于是胡乱摸索,得到解决的办法. 按住键盘上的ALT键,用鼠标向上拖动安装的界面,最好是 ...

  8. php 无限分类 树形数据 格式化

    测试demo ------------------------------------------------------------------------------------ <?php ...

  9. Java知多少(78)Java向量(Vector)及其应用

    Vector(向量)是 java.util 包中的一个类,该类实现了类似动态数组的功能. 向量和数组相似,都可以保存一组数据(数据列表).但是数组的大小是固定的,一旦指定,就不能改变,而向量却提供了一 ...

  10. oracle函数详解-转

    1.SQL 语句基础 下面给出SQL语句的基本介绍. 1.1.SQL语句所用符号 操作符 用途 例子 + - 表示正数或负数,正数可省去 + -1234.56 + 将两个数或表达式进行相加 A=c+b ...