矩阵翻硬币

今天再看蓝桥杯的时候,看见一道有趣的贪心题。

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

可以知道,假设是一个(1,m)的矩阵,那么某个硬币被翻的次数是由它所在的位置决定的,假设一个硬币位置为(1,6)那么,在翻(1,1),(1,2),(1,3)时都会被翻一次,加上其自身,翻到的次数就是四次;最后状态不变。如果一个硬币的位置是(1,5),那么翻(1,1),(1,5)的时候被翻转;结果状态不变。如果是(1,9),那么(1,1),(1,3),(1,9)时翻转,状态改变。相同,如果是(1,4),状态也会改变,其原因就是该数的两个约数相等,所以减少了一次翻转的机会。所以对于这个行数为1的矩阵,状态被改变的数目也就是在m以内所有可开方数的数目和,我们只要知道m以内有多少个数可以写成m=k^2的方式即可。
我们假设m=30,那么最大的看开方数是5(5^2=25),所以,就必定存在4,3,2,1四个可开方数,结合上面的推论,有5个硬币的状态被改变,最初共有5个反面的硬币。
在我们计算的时候,只需要求出一个数的最大可开方数取整,即是可开方数的个数。

将范围扩大到(n,m),这时要考虑的是行数增加的影响,若位置是(2,9),该硬币不但会在(2,1),(2,3),(2,9)时被翻转三次,还会在(1,1),(1,3),(1,9)时被翻转,故在行,列,位置都是不可开方数的时候才会出现状态改变,设n,m的可开方数目分别为i,j,那么该矩阵的总反面硬币个数为i与j的积。

因此我们的计算方法为:
1,寻找两个数的最大可开方数
2,将最大可开方数相乘

具体实现涉及到了大数的计算,字符串的应用问题,在这里就不多说了。具体代码演示:

#include <iostream>
#include <string>
#include <string.h>
#include <sstream>
using namespace std;


string multiply(string str1,string str2)//字符串相乘函数 
{
string str="";  //最终结果 
int len1=str1.size(),len2=str2.size(),i,j;//计算两个字符串的函数 
int result[1000]={0};  //开辟数组存乘积并初始化 
for(i=len1-1;i>=0;i--)
 for(j=len2-1;j>=0;j--)
 {
  result[i+j+1]+=(str1[i]-'0')*(str2[j]-'0');
 }
for(i=len1+len2-1;i>=1;i--)//让数组的每一位都是正确的数 
{
result[i-1]=result[i-1]+result[i]/10;
result[i]=result[i]%10;
}
for(i=0;result[i]==0;i++) //前导零不要 
    ;
    for(j=i;j<len1+len2;j++)//转成字符串形式 
        str+=result[j]+'0';
    return str;
}
int compare(string str1,string str,int pos)//字符串比较函数 
{
    int len1=str1.size();
    int len2=str.size();
    if(len2>len1+pos)return 0;
    if(len2<len1+pos)return 1;
    for(int i=0;i<len2;i++)
    {
    if(str1[i]-'0'>str[i]-'0')return 1;
    if(str1[i]-'0'<str[i]-'0')return 0;
}
}


string strsqrt(string str)//对字符串开方取整函数 
{
int len=str.size();
string str1="",str2="";
for(int i=0;i<(len+1)/2;i++)//若len为偶数,len/2=(len+1)/2;若len为奇数,len/2+1=(len+1)/2 
       for(int j=0;j<=9;j++)   //因为每一位的数值都是0~9 
       {
         str1=str2;
          str1+=j+'0';
         if(compare(multiply(str1,str1),str,2*((len+1)/2-1-i))==1)//由于str1后少了(len+1)/2-i-1个0,所以平方以后少了2*((len+1)/2-i-1)个  
            {
               str2+=j-1+'0';
              break;
            }
         if(j==9)
           str2+='9';
       }
    return str2;
}


int main()
{
string n,m;
cin>>n>>m;
cout<<multiply(strsqrt(n),strsqrt(m))<<endl;
return 0;
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,108评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,699评论 1 296
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,812评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,236评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,583评论 3 288
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,739评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,957评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,704评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,447评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,643评论 2 249
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,133评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,486评论 3 256
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,151评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,108评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,889评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,782评论 2 277
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,681评论 2 272

推荐阅读更多精彩内容