第五届蓝桥杯软件类省赛真题-Java高职-矩阵翻硬币

来源:互联网 发布:部落冲突野蛮人数据 编辑:程序博客网 时间:2024/04/29 19:10


标题:矩阵翻硬币


    小明先把硬币摆成了一个 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次方)。


资源约定:
峰值内存消耗(含虚拟机) < 256M
CPU消耗  < 2000ms




请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。


所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
注意:不要使用package语句。不要使用jdk1.7及以上版本的特性。

注意:主类的名字必须是:Main,否则按无效代码处理。

package two;


import java.awt.List;
import java.util.ArrayList;
import java.util.Scanner;


public class t10{
public static void main(String arg[]){
Scanner input  = new Scanner(System.in);
int n,m;
n = input.nextInt();
m = input.nextInt();
int[][] s = new int[n][m];
for(int i = 0;i<n;i++){
for(int j = 0;j<m;j++){
s[i][j] = 1;
}
}
for(int ss = 1;ss<=n*m;ss++){
int x = ss/m+1;
int y = ss%m;
if(ss%m==0){
x=ss/m;
y=m;
}
for(int i = 1;i*x<= n;i++){  
                for(int j = 1;j *y<= m;j++){
                if(s[i*x-1][j*y-1]==1)
                s[i*x-1][j*y-1]=0;
                else
                s[i*x-1][j*y-1]=1;
                }  
}
}
int count = 0;
for(int i = 0;i<n;i++){
for(int j = 0;j<m;j++){
if(s[i][j]==0)
count++;
}
}
System.out.print(count);
}
}


0 0
原创粉丝点击