2018中国大学生程序设计竞赛 - 网络选拔赛 Dream hdu6440 Dream 给出一个(流氓)构造法
Posted COLORFUL
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2018中国大学生程序设计竞赛 - 网络选拔赛 Dream hdu6440 Dream 给出一个(流氓)构造法相关的知识,希望对你有一定的参考价值。
http://acm.hdu.edu.cn/showproblem.php?pid=6440
题意:让你重新定义任意一对数的乘法和加法结果(输出乘法口诀表和加法口诀表),使得m^p+n^p==(m+n)^p(p为质数),并且存在一个0<q<p使得 q^k(0<k<p)取遍1~p-1的所有值,并且该运算是封闭的(exists an integer q(0<q<p) to make the set {qk|0<k<p,k∈Z} equal to {k|0<k<p,k∈Z}.)
题解:不难看出,出题人想要你把加法重定义成乘法,这样明显满足m^p+n^p==(m+n)^p,并且modp以后能取遍1~p-1的所有值。并且能卡掉全部输出零的流氓方法。
这里给出另一种流氓做法,
先考虑如何使得 q^k取遍1~p-1的所有值,
因为q^5==1*q*q*q*q*q,
定义
1*q=2
2*q=3
3*q=4
4*q=1
于是q^5次方为2.
在乘法表中就是竖着填2341。
我们把每一列都这么填,
此时对任意x有x^p==2,我们只需将m^p+n^p定义成二即可。
怎么做呢? 把加法表填满2就行。
ac代码:
#include<iostream> #include<cstdio> using namespace std; int n, N; #define rep(i,t,n) for(int i =(t);i<=(n);++i) #define per(i,n,t) for(int i =(n);i>=(t);--i) int main() { int t; cin >> t; while (t--) { int n; cin >> n; if (n == 2) {printf("0 1\n1 0\n0 0\n0 1");} else { rep(i, 1, n) { rep(j, 1, n) cout << 2 << ‘ ‘; cout << endl; } rep(i, 1, n)printf("0 "); printf("\n"); rep(i, 2, n - 1) {rep(j, 1, n) printf("%d ", i ); printf("\n");} rep(i, 1, n)printf("1 "); printf("\n"); } } return 0; }
以上是关于2018中国大学生程序设计竞赛 - 网络选拔赛 Dream hdu6440 Dream 给出一个(流氓)构造法的主要内容,如果未能解决你的问题,请参考以下文章
HDU - 6440 Dream 2018中国大学生程序设计竞赛 - 网络选拔赛
2018中国大学生程序设计竞赛 - 网络选拔赛 1009 - Tree and Permutation dfs+树上两点距离和
2018中国大学生程序设计竞赛 - 网络选拔赛 hdu6438 Buy and Resell 买入卖出问题 贪心
2018中国大学生程序设计竞赛 - 网络选拔赛 1001 - Buy and Resell 优先队列维护最小堆+贪心
HDU6447 YJJ's Salesman 2018中国大学生程序设计竞赛 - 网络选拔赛1010 离散化+线段树+DP