• 2018中国大学生程序设计竞赛


    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
    1 0
    0 0
    0 1");}
            else {
                rep(i, 1, n) { rep(j, 1, n) cout << 2 << ' '; cout << endl; }
                rep(i, 1, n)printf("0 "); printf("
    ");
                rep(i, 2, n - 1) {rep(j, 1, n) printf("%d ", i ); printf("
    ");}
                rep(i, 1, n)printf("1 "); printf("
    ");
            }
    
        }
        return 0;
    }

      

    成功的路并不拥挤,因为大部分人都在颓(笑)
  • 相关阅读:
    基金进阶
    gpgj-19.高级课总结
    (10)大类资产配置一升级版股债平衡
    13.高速公路行业
    16.投资法总结以及类集团公司介绍
    08.零售类公司分析•上
    在Ubuntu 12.04系统中安装配置OpenCV 2.4.3的方法
    一台电脑上含有多个ubuntu系统的卸载方法
    Linux命令每日一个
    Java UDP实现聊天功能代码
  • 原文地址:https://www.cnblogs.com/SuuT/p/9534892.html
Copyright © 2020-2023  润新知