hdu2017青岛网络赛Pythagoras(Tree of primitive Pythagorean triples)
题面:
思维过程:
感觉求出所有的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)相关推荐
- HDU 6208 The Dominator of Strings ——(青岛网络赛,AC自动机)
最长的才可能成为答案,那么除了最长的以外全部insert到自动机里,再拿最长的去match,如果match完以后cnt全被清空了,那么这个最长串就是答案.事实上方便起见这个最长串一起丢进去也无妨,而且 ...
- 2018 青岛网络赛C题Halting Problem
判断一个指定的程序是一直运行下去还是会停止.停止好判断,就是如何判断是否会一直运行下去.当第二次到达第n步的时候,如果此时的r仍然是第一次到达第n步时候的r,那么这个程序会一直运行下去. 通过这道题还 ...
- 2017 西安网络赛A Tree(树上静态查询,带权并查集,矩阵乘法压位,好题)
题目链接 题意: 给出 \(n(n \leq 3000)\) 个结点的一棵树,树上每个结点有一个 \(64 \times 64\) 的 \(0,1\)矩阵,每个结点上的矩阵是根据输入的 \(seed\ ...
- Distance on the tree(树上倍增+主席树+树上差分+lca)南昌网络赛
题目链接:南昌邀请赛网络赛Distance on the tree 统计一条链上边权小于k的边数. 树上差分,对于边权来说,一条链上的边的条数=sum[x]+sum[y]-2*sum[lca(x,y) ...
- 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 ...
- 2019 ICPC中国邀请赛(南昌)暨国际丝绸之路程序设计竞赛-网络赛题解
以下所有AC题解程序来自"仙客传奇"团队. AC题数:10/13 ABCDHIJKLM A. PERFECT NUMBER PROBLEM 解题思路:先编写离线程序计算出最小的5个 ...
- 2017 ACM-ICPC 亚洲区(西安赛区)网络赛 xor (根号分治)
xor There is a tree with nn nodes. For each node, there is an integer value a_iai, (1 \le a_i \le ...
- 2022-BNUZ-IT节程序设计竞赛网络赛题解
IT节程序设计竞赛-网络赛题目解析 A-纯阳之体 解析 本题是一个双指针问题,当然直接暴力也是可以做的.主要思想就是先求最长连续且不含重复字符的字串的长度.有了长度之后就可以再进行一次搜索,当长度 ...
- 2021年安徽省大数据与人工智能应用竞赛人工智能(网络赛)-本科组赛题
第一部分:人工智能基础环境搭建部署(15分) 注:任务1与任务2任选一题完成即可. o 任务1:Anaconda 3.scikit-learn.OpenCV 3.X.PyTorch 1.8.X.tor ...
最新文章
- Laravel框架学习 -- php artisan down/up
- STL中的unique函数
- 用Vue的父子组件通信实现todolist的功能
- 从零搭建nginx服务器
- php fuzzy,模糊C均值聚类算法(Fuzzy C-means)
- jQuery性能优化指南(1)
- 孤独的周鸿祎,落寞的 360
- vector public member function
- 基于yolov3 v4 v5的电梯轿厢下的电动车目标检测
- matlab泰勒 习题,泰勒公式及其应用典型例题
- pgsql在连接的时候报:不支援 10 验证类型。请核对您已经组态。。。
- 计算机网络常见缩略语
- c语言猴子吃桃问题(简洁做法)
- 百度竞价点击价格怎么算
- Python脚本实现Mac开机自动语音播报天气
- 直播软件开发Android直播悬浮窗实现
- 利用 CPU 流水线加快数据处理
- CC2540TR2.4Mini蓝牙模块详细数据
- (重点)C#/Csharp桌面应用开发小作业小程序,测距仪,画圆,GDI画圆,画直线,绘制圆,绘制直线,绘制虚线,dashpattern的应用
- 全球首个Apicloud 视频压缩模块正式上线