水题两篇 Dream & Find Integer (HDU 6440/6441)
// 出自ICPC 2018网络赛C - Dream & D - Find Integer
// 对大佬来讲的水题,本菜鸡尽量学会的防爆零题。。。
// 今晚翻看vjudge昨日任务上的C题,发现好多人一发过了,我想它应该不难吧,但自己始终没想明白,到底该如何构造一种符合题意封闭的加法和乘法运算。
// 参考了这里的说明,才完全弄懂了,写点东西记录学习成果。
C - Dream (HDU 6440)
题目要求重新定义加法和乘法,对任意非负整数都满足:(m+n)p=mp+np,其中p为素数。 之前我在数论部分的博客已经提到过费马小定理,比赛时候面对这题时竟然完全没有联想到,反倒还被题目的各种概念给绕晕。这里再次说明费马小定理:
假如p是质数,且gcd(a,p)=1,那么 ap-1≡1(mod p)
这样就找到了符合题意的运算,即模p加法与模p乘法。明白这一点,代码就很简单了:
#include <cstdio>. #include <iostream> #define sci(i) scanf("%d", &i) #define rep(i, a, b) for(int i=a;i<b;i++) using namespace std; int main() { int T; sci(T); while(T--) { int p; sci(p); rep(i, 0, p) { rep(j, 0, p) printf("%d ", (i+j)%p); printf("\n"); } rep(i, 0, p) { rep(j, 0, p) printf("%d ", i*j%p); printf("\n"); } } return 0; }
// 第一次尝试用以上宏定义#define的新姿势,代码更显简短清爽~~~
D - Find Interger (HDU 6441)
题意很明朗: 给定a和n,求满足条件 an+bn=cn 的正整数b和c。
// 上一行会吞字,原因不明。。。
// 避免吞字,截图插入。。。
// 左边原文,右边显示
这与费马大定理有关:
当整数时,关于的方程没有正整数解
那么题目就简单分四种情况:
- n>2,由费马大定理可知,不存在解
- n=0时,等式恒不成立,无解输出 -1 -1
- n=1时,可取b=1, c=a+1
- 对于n=2的解(b, c),详细见代码部分的注释
#include <iostream> #include <cstdio> using namespace std; int n, a; int main() { int T; cin>>T; while(T--) { scanf("%d %d", &n, &a); if(n>2||n==0) {printf("-1 -1\n"); continue; } if(n==1) {printf("1 %d\n", a+1); continue; } else { //a*a = c*c - b*b = (c-b)*(c+b) if(a&1) // c-b=1, c+b=a*a printf("%d %d\n", (a*a-1)/2, (a*a+1)/2); else // c-b=2, c+b=a*a/2 printf("%d %d\n", (a*a/2-2)/2, (a*a/2+2)/2); } } return 0; }
End.