码迷,mamicode.com
首页 > 其他好文 > 详细

2018中国大学生程序设计竞赛 - 网络选拔赛 Dream hdu6440 Dream 给出一个(流氓)构造法

时间:2018-08-25 20:04:07      阅读:456      评论:0      收藏:0      [点我收藏+]

标签:exist   set   重定义   乘法表   次方   iostream   integer   tom   乘法口诀   

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,kZ} equal to {k|0<k<p,kZ}.)

题解:不难看出,出题人想要你把加法重定义成乘法,这样明显满足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 给出一个(流氓)构造法

标签:exist   set   重定义   乘法表   次方   iostream   integer   tom   乘法口诀   

原文地址:https://www.cnblogs.com/SuuT/p/9534892.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!