uva 11024 - Circular Lock(数学)

题目链接:uva 11024 - Circular Lock

题目大意;有个2*2的矩阵,给定p,s,P为p数组中所有元素的最大公约数。s为2*2矩阵的初始状态,每次可以选择一行或是一列同时加1,最终使得sij%P=0

解题思路:gij为aij还需要多少可以是P的倍数,判断g11?g12?g21+g22是P的倍数即可。

/********************
 * A + C = a + k1 * p
 * B + C = b + k2 * p
 * A + D = c + k3 * p
 * B + D = d + k4 * p
 *
 * a - b - c + d + (k1 - k2 - k3 + k4) * p
 *  = 0;
********************/

#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;
const int maxn = 5;

int s[maxn][maxn], p[maxn][maxn];

inline int gcd (int a, int b) {
    return b == 0 ? a : gcd(b, a % b);
}

int main () {
    int cas;
    scanf("%d", &cas);
    while (cas--) {
        for (int i  = 1; i <= 2; i++)
            scanf("%d %d %d %d", &s[i][1], &s[i][2], &p[i][1], &p[i][2]);

        int P = p[1][1];
        for (int i = 1; i <= 2; i++)
            for (int j = 1; j <= 2; j++)
                P = gcd(P, p[i][j]);

        int sum = 0;
        for (int i = 1; i <= 2; i++) {
            for (int j = 1; j <= 2; j++) {
                s[i][j] = P - s[i][j] % P;
                if (i == j)
                    sum += s[i][j];
                else
                    sum -= s[i][j];
            }
        }
        printf("%s\n", sum % P == 0 ? "Yes" : "No");
    }
    return 0;
}

uva 11024 - Circular Lock(数学)

时间: 2024-08-19 00:35:43

uva 11024 - Circular Lock(数学)的相关文章

UVA 11024 - Circular Lock(数论+推理)

UVA 11024 - Circular Lock 题目链接 题意:给定一个矩阵,每次能在一行或者一列都加1,问能否构造出满足每个位置%P都等于0的矩阵,P的得到方法为矩阵p所有数字的gcd 思路:推公式啊,一共4个加值的方法,分别为A,B,C,D A + C 加到A位置上a + k1 p,a为原位置差多少为p的倍数 同理 A + D 加到A位置上b + k2 p B + C 加到A位置上c + k3 p B + D 加到A位置上d + k4 p 这样一来消掉就得到a - b - c + d +

UVa 1584 Circular Sequence --- 水题

UVa 1584 题目大意:给定一个含有n个字母的环状字符串,可从任意位置开始按顺时针读取n个字母,输出其中字典序最小的结果 解题思路:先利用模运算实现一个判定给定一个环状的串以及两个首字母位置,比较二者字典序大小的函数, 然后再用一层循环,进行n次比较,保存最小的字典序的串的首字母位置,再利用模运算输出即可 /* UVa 1584 Circular Sequence --- 水题 */ #include <cstdio> #include <cstring> //字符串s为环状,

uva 10623 - Thinking Backward(数学)

题目链接:uva 10623 - Thinking Backward 题目大意:就是给出N,表示要将平面分解成N份,问有哪些可选则的方案,m表示椭圆.n表示圆形.p表示三角形的个数,m.n.p分别给定范围. 解题思路:本来这题一点思路都没有,但是在论坛上看到一个公式N=2+2m(m?1)+n(n?1)+4mn+3p(p?1)+6mp+6np 这样只要枚举m和p,求解n,判断n是否满足即可,注意n一定是整数. #include <cstdio> #include <cstring>

uva 11657 - Rational Billiard(数学)

题目链接:uva 11657 - Rational Billiard 题目大意:给定一个边界M,N,以及第一个球和第二个球的位置,第一个球以p,q的方向移动,碰到边界后被反弹,和光线的路线一致,问有没有可能集中第二个球. 解题思路:在网上参考别人的思路,首先将横纵坐标扩大相应倍数,保证p,q每移动一次对应在新平面为单位长度,然后只需要考虑横向移动所需要的步数,减掉纵向移动所需的步数后,剩余的步数是否满足周期的倍数即可.考虑四种请况.这题数据非常水,一开始坐标写错也过了. #include <cs

UVA 10668 - Expanding Rods(数学+二分)

UVA 10668 - Expanding Rods 题目链接 题意:给定一个铁棒,如图中加热会变成一段圆弧,长度为L′=(1+nc)l,问这时和原来位置的高度之差 思路:画一下图可以很容易推出公式,设圆弧扇形部弧度r,那么可以计算出铁棒长度为lr/sin(r)这个公式在[0, pi/2]是单调递增的,所以可以用二分法去求解 要注意的一点是最后答案计算过程中带入mid,之前是带入x(二分的左边值),可实际上x是可能等于0的,而带入mid,由于是double型,所以mid实际上表示是一个非常趋近0

uva 616 - Coconuts, Revisited(数学)

题目链接:uva 616 - Coconuts, Revisited 题目大意:题目背景和uva 10726是一样的,只是这道题目是给出n,表示椰子的个数,并且猴子的个数为1,问说是否能找到满足的人数,并且要求人数尽量大. 解题思路:枚举人数,然后根据uva 10726推出的公式去求出最后剩下的椰子是否满足平分等判断. #include <cstdio> #include <cstring> #include <cmath> #include <iostream&

uva 617- Nonstop Travel(暴力+数学)

题目链接:uva 617 - Nonstop Travel 题目大意:在一条路上有n个红绿灯,给出红绿灯的位置,以及绿灯,黄灯和红灯的时间,问现在以什么样的速度可以不同停止便通过这条路段.(速度只在30~60km/h) 解题思路:枚举速度,然后判断即可. 注意说黄灯也是可以过的,以及红绿灯的距离是以米为单位的. #include <cstdio> #include <cstring> const int N = 10; struct state { double dis; int

uva 1584 Circular Sequence (字符串处理)

C - Circular Sequence Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit Status Description Some DNA sequences exist in circular forms as in the following figure, which shows a circular sequence ``CGAGTCAGCT", that is,

UVa 1639 Candy (数学期望+组合数学+高精度存储)

题意:有两个盒子各有n个糖,每次随机选一个(概率分别为p,1-p),然后吃掉,直到有一次,你打开盒子发现,没糖了! 输入n,p,求另一个盒子里糖的个数的数学期望. 析:先不说这个题多坑,首先要用long double来实现高精度,我先用的double一直WA,后来看了题解是用long double, 改了,可一直改不对,怎么输出结果都是-2.00000,搞了一晚上,真是无语,因为我输入输出数据类型是long double, 结果一直不对 ,可能是我的编译器是C89的吧,和C语言,输入输出格式不同