题面:

Given a list of integers a0,a1,a2,⋯,a2k−1. Pythagoras triples over 109 are all solutions of x2+y2=z2 where x,y and z are constrained to be positive integers less than or equal to 109. You are to compute the sum of ay mod 2k of triples (x,y,z) such that x<y<z and they are relatively prime, i.e., have no common divisor larger than 1.

思维过程:

感觉求出所有的y是必须的,设y的集合为A。求出y后就可以O(num(A))的解决问题了。同时又至少要O(num(A))的时间复杂度,所以决定总复杂度的是求出A集合的算法复杂度,我们要思考的就是如何更快的求出集合A。

解法:

先考虑一些引理。

引理一:

本原勾股数都可表示为如下三元组(2*u*v,u*u-v*v,u*u+v*v)。

证明:显然,或者说基础。

引理二:

存在这样的矩阵A,A可逆,且存在无穷多个满足x*x+y*y=z*z的向量(x,y,z)A左乘该向量得到的新向量(x1,y1,z1)也满足x1*x1+y1*y1=z1*z1,并且z1<=z。设这样的矩阵A集为U。

证明:设矩阵A的各种参数去构造矩阵A,随便构造就可以发现好几个。

推论:

A的逆也满足以上除了(z1<=z)的性质,即z1>z。

引理二:

在上面的U集中一定可以找到三个元素A1,A2,A3,使得对于每一个勾股三元组,一定在A1,A2,A3中有且只有一个使得左乘该三元组,能得到新的勾股三元组。

证明:额。。。略。。。论文里应该有的。。。

推论:

可以用A1,A2,A3各自的逆构造出所有的本原勾股数三元组。

证明:

z的单调不增性,且Ai的不动点唯一。

wiki链接(https://en.wikipedia.org/wiki/Tree_of_primitive_Pythagorean_triples)。

好了我们可以列出如下几个矩阵:

对应于上面说的A1,A2,A3各自的逆。

但是实际上还有别的矩阵组也可以。。。

第一个可以从结点(3,4,5)用bfs的方式构建一颗树,这个树名就叫做Tree of primitive Pythagorean triples

因此我们找到了求A集合最好的方法。

代码:

#include <iostream>
#include <cstdio>
using namespace std;
typedef long long ll;
const int man=1e9;
const int Mod=(1<<17)-1;
int change[Mod];
void dfs(ll x,ll y,ll z){
    if (z>man) {
        return;
    }
    change[max(x,y)&Mod]++;
    ll xx=x<<1;
    ll yy=y<<1;
    ll zz=z<<1;
    dfs(x-yy+zz, xx-y+zz, xx-yy+zz+z);
    dfs(x+yy+zz, xx+y+zz, xx+yy+zz+z);
    dfs(yy+zz-x, y+zz-xx, yy+zz+z-xx);
}
int main(){
    int t;
    cin>>t;
    dfs(3, 4, 5);
    while (t--) {
        int k;
        cin>>k;
        int mod=1<<k;
        ll sum=0;
        int a;
        int j;
        for (int i=0; i<mod; i++) {
            scanf("%d",&a);
            j=i;
            while (j<=Mod) {
                sum+=change[j]*a;
                j+=mod;
            }
        }
        printf("%lld\n",sum);
    }
    return 0;
}

hdu2017青岛网络赛Pythagoras(Tree of primitive Pythagorean triples)相关推荐

  1. HDU 6208 The Dominator of Strings ——(青岛网络赛,AC自动机)

    最长的才可能成为答案,那么除了最长的以外全部insert到自动机里,再拿最长的去match,如果match完以后cnt全被清空了,那么这个最长串就是答案.事实上方便起见这个最长串一起丢进去也无妨,而且 ...

  2. 2018 青岛网络赛C题Halting Problem

    判断一个指定的程序是一直运行下去还是会停止.停止好判断,就是如何判断是否会一直运行下去.当第二次到达第n步的时候,如果此时的r仍然是第一次到达第n步时候的r,那么这个程序会一直运行下去. 通过这道题还 ...

  3. 2017 西安网络赛A Tree(树上静态查询,带权并查集,矩阵乘法压位,好题)

    题目链接 题意: 给出 \(n(n \leq 3000)\) 个结点的一棵树,树上每个结点有一个 \(64 \times 64\) 的 \(0,1\)矩阵,每个结点上的矩阵是根据输入的 \(seed\ ...

  4. Distance on the tree(树上倍增+主席树+树上差分+lca)南昌网络赛

    题目链接:南昌邀请赛网络赛Distance on the tree 统计一条链上边权小于k的边数. 树上差分,对于边权来说,一条链上的边的条数=sum[x]+sum[y]-2*sum[lca(x,y) ...

  5. 2019ICPC南京网络赛A题 The beautiful values of the palace(三维偏序)

    2019ICPC南京网络赛A题 The beautiful values of the palace https://nanti.jisuanke.com/t/41298 Here is a squa ...

  6. 2019 ICPC中国邀请赛(南昌)暨国际丝绸之路程序设计竞赛-网络赛题解

    以下所有AC题解程序来自"仙客传奇"团队. AC题数:10/13 ABCDHIJKLM A. PERFECT NUMBER PROBLEM 解题思路:先编写离线程序计算出最小的5个 ...

  7. 2017 ACM-ICPC 亚洲区(西安赛区)网络赛 xor (根号分治)

    xor There is a tree with nn nodes. For each node, there is an integer value a_ia​i​​, (1 \le a_i \le ...

  8. 2022-BNUZ-IT节程序设计竞赛网络赛题解

    IT节程序设计竞赛-网络赛题目解析 A-纯阳之体 解析 ​ 本题是一个双指针问题,当然直接暴力也是可以做的.主要思想就是先求最长连续且不含重复字符的字串的长度.有了长度之后就可以再进行一次搜索,当长度 ...

  9. 2021年安徽省大数据与人工智能应用竞赛人工智能(网络赛)-本科组赛题

    第一部分:人工智能基础环境搭建部署(15分) 注:任务1与任务2任选一题完成即可. o 任务1:Anaconda 3.scikit-learn.OpenCV 3.X.PyTorch 1.8.X.tor ...

最新文章

  1. Laravel框架学习 -- php artisan down/up
  2. STL中的unique函数
  3. 用Vue的父子组件通信实现todolist的功能
  4. 从零搭建nginx服务器
  5. php fuzzy,模糊C均值聚类算法(Fuzzy C-means)
  6. jQuery性能优化指南(1)
  7. 孤独的周鸿祎,落寞的 360
  8. vector public member function
  9. 基于yolov3 v4 v5的电梯轿厢下的电动车目标检测
  10. matlab泰勒 习题,泰勒公式及其应用典型例题
  11. pgsql在连接的时候报:不支援 10 验证类型。请核对您已经组态。。。
  12. 计算机网络常见缩略语
  13. c语言猴子吃桃问题(简洁做法)
  14. 百度竞价点击价格怎么算
  15. Python脚本实现Mac开机自动语音播报天气
  16. 直播软件开发Android直播悬浮窗实现
  17. 利用 CPU 流水线加快数据处理
  18. CC2540TR2.4Mini蓝牙模块详细数据
  19. (重点)C#/Csharp桌面应用开发小作业小程序,测距仪,画圆,GDI画圆,画直线,绘制圆,绘制直线,绘制虚线,dashpattern的应用
  20. 全球首个Apicloud 视频压缩模块正式上线

热门文章

  1. abp 使用mysql_ABP Vnext使用mysql数据库
  2. 网络笔记:路由选路原则
  3. rss下载_Microsoft下载中心RSS提要
  4. 关于鼠标手的症状和恢复方法
  5. SXT:聚合与组合的理解
  6. 基于Java的飞机大战的课程设计与实现
  7. 更改PPT的模板名称
  8. windows用ffmpeg将flv视频转换为mp4
  9. 《跟开涛学SpringMVC》学习笔记
  10. 如何更改计算机管理员账户名称,win10系统管理员名称怎么改_win10管理员账户名怎么修改...