矩阵翻硬币 数学 蓝桥杯

题目描述:
    小明先把硬币摆成了一个 n 行 m列的矩阵。随后,小明对每一个硬币分别进行一次 Q 操作。对第x行第y列的硬币进行 Q 操作的定义:将所有第 i*x 行,第 j*y列的硬币进行翻转。其中i和j为任意使操作可行的正整数,行号和列号都是从1开始。
    当小明对所有硬币都进行了一次 Q操作后,他发现了一个奇迹——所有硬币均为正面朝上。
   想知道最开始有多少枚硬币是反面朝上的。只需要对所有硬币再进行一次Q操作,即可恢复到最开始的状态。小明希望你给出他更好的方法。帮他计算出答案。

【数据格式】
    输入数据包含一行,两个正整数 nm,含义见题目描述。输出一个正整数,表示最开始有多少枚硬币是反面朝上的。

【样例输入】
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次方)。


分析:
如果用模拟,10^1000,拿个10分吧。这题我自己想了好久没有想出来,问学长,几乎秒答…………
最终全部为正面向上,求最初反面向上的个数。显然,对于反面向上的,需要翻奇数次就可以形成正面向上,那问题就是求 一共翻了奇数次的硬币的个数即可
然后, i*x,j*y (翻转x的倍数行,y的倍数列)( 人为定义一个概念:x*i行,y*j列被称为被硬币(x,y)翻转过),有多少个硬币翻动了我,我也会随之翻动多少次。设 xi 的翻动会引起 x,y的翻动,由题意 i*xi = x,即 xi 是 x 的约数 ,也就是说 只需要找 x,y 约数的个数即可。设 x 有 xn个约数,y 有 yn 个约数,那么 xn 中的数 与 yn 中的数任意组合,会导致 x,y 翻动 xn*yn 次, 若 xn*yn 为奇数,这个硬币被翻动了奇数次,也就是说,这枚硬币原来是反的。因任意俩个正整数相乘,当二者都为奇数时,其积才是奇数,找同时有奇数个约数的 x,y 组合的个数。显然,此时,x 和y 都有奇数个约数。 完全平方数有奇数个约数(分析:假设有几个数K不是完全平方数,则存在因子a,必定存在因子K/a,所以因子必定是偶数个,只有a==K/a即K=a*a时,因子是奇数个)。,对于给定的规模 n*m,不妨设行 n 的范围内有Pn 个完全平方数,列 m 的规模内有Pm个完全平方数,那么显然,Pn*Pm (即这些合法行列的任意组合)即为所有翻动奇数次的硬币的个数,即初始时反面朝上的硬币的个数。 对于 n,m,其范围内 [ 1 , n ] ,[ 1 , m ] 完全平方数的个数为 sqrt(n), sqrt(m)个(分析:假设一个完全平方数S<=n,则S可以写成S=k*k,k<=sqrt (n)时,S=k*k<=n,所以最多存在sqrt(n)个k,即最多存在sqrt(n)个S)。对于输入的 n,m,输出sqrt(n)*sqrt(m)即可。数据规模 10^1000 ,C/C++需要自己写高精度。
ans=sqrt(n)*sqrt(m)//写高精度

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值