蓝桥 PREV-34 历届试题 矩阵翻硬币

历届试题 矩阵翻硬币

时间限制:1.0s   内存限制:256.0MB

问题描述

  小明先把硬币摆成了一个 n 行 m 列的矩阵。

  随后,小明对每一个硬币分别进行一次 Q 操作。

  对第x行第y列的硬币进行 Q 操作的定义:将所有第 i*x 行,第 j*y 列的硬币进行翻转。

  其中i和j为任意使操作可行的正整数,行号和列号都是从1开始。

  当小明对所有硬币都进行了一次 Q 操作后,他发现了一个奇迹——所有硬币均为正面朝上。

  小明想知道最开始有多少枚硬币是反面朝上的。于是,他向他的好朋友小M寻求帮助。

  聪明的小M告诉小明,只需要对所有硬币再进行一次Q操作,即可恢复到最开始的状态。然而小明很懒,不愿意照做。于是小明希望你给出他更好的方法。帮他计算出答案。

输入格式

  输入数据包含一行,两个正整数 n m,含义见题目描述。

输出格式

  输出一个正整数,表示最开始有多少枚硬币是反面朝上的。

样例输入

2 3

样例输出

1

数据规模和约定

  对于10%的数据,n、m <= 10^3;
  对于20%的数据,n、m <= 10^7;
  对于40%的数据,n、m <= 10^15;
  对于10%的数据,n、m <= 10^1000(10的1000次方)。

题目链接:

  http://lx.lanqiao.cn/problem.page?gpid=T126

题目大意:

  

题目思路:

  【高精度】

  高精度即可。

  1 //
  2 //by coolxxx
  3 //
  4 #include<iostream>
  5 #include<algorithm>
  6 #include<string>
  7 #include<iomanip>
  8 #include<memory.h>
  9 #include<time.h>
 10 #include<stdio.h>
 11 #include<stdlib.h>
 12 #include<string.h>
 13 #include<stdbool.h>
 14 #include<math.h>
 15 #define min(a,b) ((a)<(b)?(a):(b))
 16 #define max(a,b) ((a)>(b)?(a):(b))
 17 #define abs(a) ((a)>0?(a):(-(a)))
 18 #define sqr(a) (a)*(a)
 19 #define swap(a,b) (a)^=(b),(b)^=(a),(a)^=(b)
 20 #define eps 1e-8
 21 #define S 10000
 22 #define MAX 2139062143
 23 #define PI 3.1415926535897
 24 #define N 1004
 25 using namespace std;
 26 int n,m,cas,lll;
 27 int px[N],py[N],nn[N],mm[N];
 28 char sn[N],sm[N];
 29 void gjdprint(int a[])
 30 {
 31     int i;
 32     for(i=a[0];i;i--)
 33         printf("%d",a[i]);
 34     puts("");
 35 }
 36 int gjdcompare(int a[],int b[])//a<b->1  a=b->0  a>b->-1
 37 {
 38     int i;
 39     if(a[0]<b[0])return 1;
 40     if(a[0]>b[0])return -1;
 41     for(i=a[0];i;i--)
 42         if(a[i]<b[i])return 1;
 43         else if(a[i]>b[i])return -1;
 44     return 0;
 45 }
 46 void gjdcheng(int a[],int b[],int c[])
 47 {
 48     int i,j,t[N];
 49     memset(t,0,sizeof(t));
 50     t[0]=a[0]+b[0];
 51     for(i=1;i<=a[0];i++)
 52         for(j=1;j<=b[0];j++)
 53             t[i+j-1]+=a[i]*b[j];
 54     for(i=1;i<=t[0];i++)
 55         t[i+1]+=t[i]/10,t[i]%=10;
 56     while(t[t[0]+1])t[0]++;
 57     while(!t[t[0]])t[0]--;
 58     memcpy(c,t,sizeof(t));
 59 }
 60 int calculate(int a[],int b[])
 61 {
 62     int t[N];
 63     memset(t,0,sizeof(t));
 64     gjdcheng(a,a,t);
 65     return gjdcompare(t,b);
 66 }
 67 int main()
 68 {
 69     #ifndef ONLINE_JUDGE
 70     //freopen("1.txt","r",stdin);
 71     //freopen("2.txt","w",stdout);
 72     #endif
 73     int i,j,x,y;
 74     while(~scanf("%s%s",sn,sm))
 75     //while(~scanf("%d",&n) && n)
 76     {
 77         memset(nn,0,sizeof(nn));
 78         memset(mm,0,sizeof(mm));
 79         nn[0]=strlen(sn);
 80         mm[0]=strlen(sm);
 81         for(i=1;i<=nn[0];i++)
 82             nn[i]=sn[nn[0]-i]-‘0‘;
 83         for(i=1;i<=mm[0];i++)
 84             mm[i]=sm[mm[0]-i]-‘0‘;
 85         px[0]=nn[0]/2+1;
 86         py[0]=mm[0]/2+1;
 87         for(i=px[0];i;i--)
 88         {
 89             j=calculate(px,nn);
 90             while(j>=0)
 91             {
 92                 if(j==0)break;
 93                 px[i]++;
 94                 j=calculate(px,nn);
 95             }
 96             if(j==0)break;
 97             px[i]--;
 98         }
 99         for(i=py[0];i;i--)
100         {
101             j=calculate(py,mm);
102             while(j>=0)
103             {
104                 if(j==0)break;
105                 py[i]++;
106                 j=calculate(py,mm);
107             }
108             if(j==0)break;
109             py[i]--;
110         }
111         gjdcheng(px,py,px);
112         gjdprint(px);
113     }
114     return 0;
115 }
116
117
118 /*
119 //
120
121 //
122 */

时间: 2024-10-08 09:24:51

蓝桥 PREV-34 历届试题 矩阵翻硬币的相关文章

历届试题 矩阵翻硬币 (蓝桥杯)

历届试题 矩阵翻硬币 时间限制:1.0s   内存限制:256.0MB 问题描述 小明先把硬币摆成了一个 n 行 m 列的矩阵. 随后,小明对每一个硬币分别进行一次 Q 操作. 对第x行第y列的硬币进行 Q 操作的定义:将所有第 i*x 行,第 j*y 列的硬币进行翻转. 其中i和j为任意使操作可行的正整数,行号和列号都是从1开始. 当小明对所有硬币都进行了一次 Q 操作后,他发现了一个奇迹——所有硬币均为正面朝上. 小明想知道最开始有多少枚硬币是反面朝上的.于是,他向他的好朋友小M寻求帮助.

算法笔记168:历届试题 矩阵翻硬币(Java)

目录 1 问题描述 2 解决方案   1 问题描述 问题描述 小明先把硬币摆成了一个 n 行 m 列的矩阵. 随后,小明对每一个硬币分别进行一次 Q 操作. 对第x行第y列的硬币进行 Q 操作的定义:将所有第 i*x 行,第 j*y 列的硬币进行翻转. 其中i和j为任意使操作可行的正整数,行号和列号都是从1开始. 当小明对所有硬币都进行了一次 Q 操作后,他发现了一个奇迹--所有硬币均为正面朝上. 小明想知道最开始有多少枚硬币是反面朝上的.于是,他向他的好朋友小M寻求帮助. 聪明的小M告诉小明,

历届试题 矩阵翻硬币

问题描述 小明先把硬币摆成了一个 n 行 m 列的矩阵. 随后,小明对每一个硬币分别进行一次 Q 操作. 对第x行第y列的硬币进行 Q 操作的定义:将所有第 i*x 行,第 j*y 列的硬币进行翻转. 其中i和j为任意使操作可行的正整数,行号和列号都是从1开始. 当小明对所有硬币都进行了一次 Q 操作后,他发现了一个奇迹--所有硬币均为正面朝上. 小明想知道最开始有多少枚硬币是反面朝上的.于是,他向他的好朋友小M寻求帮助. 聪明的小M告诉小明,只需要对所有硬币再进行一次Q操作,即可恢复到最开始的

蓝桥杯 历届试题 PREV-34 矩阵翻硬币

历届试题 矩阵翻硬币 时间限制:1.0s   内存限制:256.0MB 问题描述 小明先把硬币摆成了一个 n 行 m 列的矩阵. 随后,小明对每一个硬币分别进行一次 Q 操作. 对第x行第y列的硬币进行 Q 操作的定义:将所有第 i*x 行,第 j*y 列的硬币进行翻转. 其中i和j为任意使操作可行的正整数,行号和列号都是从1开始. 当小明对所有硬币都进行了一次 Q 操作后,他发现了一个奇迹--所有硬币均为正面朝上. 小明想知道最开始有多少枚硬币是反面朝上的.于是,他向他的好朋友小M寻求帮助.

HPU1288 矩阵翻硬币 【大数】

1288: 矩阵翻硬币 时间限制: 10 Sec  内存限制: 128 MB 提交: 1  解决: 1 [提交][状态][讨论版] [Edit] 题目描述 问题描述 小明先把硬币摆成了一个 n 行 m 列的矩阵. 随后,小明对每一个硬币分别进行一次 Q 操作. 对第x行第y列的硬币进行 Q 操作的定义:将所有第 i*x 行,第 j*y 列的硬币进行翻转. 其中i和j为任意使操作可行的正整数,行号和列号都是从1开始. 当小明对所有硬币都进行了一次 Q 操作后,他发现了一个奇迹--所有硬币均为正面朝

【蓝桥杯】历届试题 翻硬币

  历届试题 翻硬币   时间限制:1.0s   内存限制:256.0MB 问题描述 小明正在玩一个“翻硬币”的游戏. 桌上放着排成一排的若干硬币.我们用 * 表示正面,用 o 表示反面(是小写字母,不是零). 比如,可能情形是:**oo***oooo 如果同时翻转左边的两个硬币,则变为:oooo***oooo 现在小明的问题是:如果已知了初始状态和要达到的目标状态,每次只能同时翻转相邻的两个硬币,那么对特定的局面,最少要翻动多少次呢? 我们约定:把翻动相邻的两个硬币叫做一步操作,那么要求: 输

【蓝桥杯】历届试题 小朋友排队(运行超时)

  历届试题 小朋友排队   时间限制:1.0s   内存限制:256.0MB 问题描述 n 个小朋友站成一排.现在要把他们按身高从低到高的顺序排列,但是每次只能交换位置相邻的两个小朋友. 每个小朋友都有一个不高兴的程度.开始的时候,所有小朋友的不高兴程度都是0. 如果某个小朋友第一次被要求交换,则他的不高兴程度增加1,如果第二次要求他交换,则他的不高兴程度增加2(即不高兴程度为3),依次类推.当要求某个小朋友第k次交换时,他的不高兴程度增加k. 请问,要让所有小朋友按从低到高排队,他们的不高兴

【蓝桥杯】历届试题 公式求值

  历届试题 公式求值   时间限制:1.0s   内存限制:256.0MB 问题描述 输入n, m, k,输出下面公式的值. 其中C_n^m是组合数,表示在n个人的集合中选出m个人组成一个集合的方案数.组合数的计算公式如下. 输入格式 输入的第一行包含一个整数n:第二行包含一个整数m,第三行包含一个整数k. 输出格式 计算上面公式的值,由于答案非常大,请输出这个值除以999101的余数. 样例输入 313 样例输出 162 样例输入 201010 样例输出 359316 数据规模和约定 对于1

【蓝桥杯】历届试题 幸运数

  历届试题 幸运数   时间限制:1.0s   内存限制:256.0MB 问题描述 幸运数是波兰数学家乌拉姆命名的.它采用与生成素数类似的“筛法”生成. 首先从1开始写出自然数1,2,3,4,5,6,.... 1 就是第一个幸运数. 我们从2这个数开始.把所有序号能被2整除的项删除,变为: 1 _ 3 _ 5 _ 7 _ 9 .... 把它们缩紧,重新记序,为: 1 3 5 7 9 .... .这时,3为第2个幸运数,然后把所有能被3整除的序号位置的数删去.注意,是序号位置,不是那个数本身能否