• 14蓝桥杯 矩阵翻硬币


    标题:矩阵翻硬币

    小明先把硬币摆成了一个 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消耗 < 1000ms

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

    所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。

    注意: main函数需要返回0
    注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。
    注意: 所有依赖的函数必须明确地在源文件中 #include , 不能通过工程设置而省略常用头文件。

    提交时,注意选择所期望的编译器类型。
    (没读懂题,找规律一直是弱鸡。。)
    参考博客:
    https://blog.csdn.net/snailset/article/details/26752435

    代码(debug半天放弃了,sqrtStr函数实在不知道哪儿没写对。)

    #include <iostream>
    #include <cstdio>
    #include <string>
    #include <algorithm>
    #include <cstring>
    #include <queue>
    #define LL long long
    using namespace std;
    string strmul(string s1,string s2)
    {
    	int i,j;
    //	cout<<s1<<endl;
    //	cout<<s2<<endl;
    //	cout<<endl;
    	int num[1000]={0};
    	int len1=s1.length();
    	int len2=s2.length();
    	string res="";
    	for(i=0;i<len1;i++)
    	  for(j=0;j<len2;j++)
    	    num[len1-1-i+len2-1-j]+=(s1[i]-'0')*(s2[j]-'0');
        for(i=0;i<len1+len2;i++)
        {
        	num[i+1]+=num[i]/10;
        	num[i]=num[i]%10;
    	}
    	for(i=len1+len2-1;i>=0;i--)
    	  if(num[i]!=0) break;
    	for(j=i;j>=0;j--)
    	  res+=(num[j]+'0');
    	return res;
    }
    //在s1后添num0个0,与s2作比较 
    int cmpstr(string s1,string s2,int num0)
    {
       int len1=s1.length();
       int len2=s2.length();
       if(len2>len1+num0)  return 0;
       if(len2<len1+num0)  return 1;
       for(int i=0;i<len2;i++)
       {
       	  if(s1[i]-'0'>s2[i]-'0') return 1;
       	  if(s1[i]-'0'<s2[i]-'0') return 0;
       }  	
       return 0;		
    }
    
    string sqrtStr(string str)
    {
        int len = str.length();
        int i = 0; 
        int j = 0;
        string strResult = "";
        string str1 = "";
        if(0 == len % 2)
        {         //为偶数位
            for(i = 0; i < len/2; i++)
            {
                for(j = 0; j < 10; j++)
                {
                	
                    str1 = strResult;
                    str1 += j + '0';
                    if(1 == cmpstr(strmul(str1, str1) , str , 2*(len/2-i-1)) )
                    {         //由于str1后少了len/2-i-1个0,所以平方以后少了2*(len/2-i-1)个
                        strResult +=  j-1 + '0';
                        break;
                    }
                    if(9 == j) strResult += '9';
                }
            }
        }
        else
        {       //为奇数位
            for(i = 0; i < len/2+1; i++)
            {
                for(j = 0; j < 10; j++)
                {
                    str1 = strResult;
                    str1 += j + '0';
                    if(1 == cmpstr(strmul(str1, str1) , str , 2*(len/2-i)) )
                    {
                        strResult +=  j-1 + '0';
                        break;
                    }
                    if(9 == j) strResult += '9';
                }
            }
        }
        return strResult;
    }
    
    
    //string sqrtStr(string s)
    //{
    //   int len=s.length();
    //   string res="";
    //   string ss="";
    //   if(len%2==0)
    //   {
    //   	  for(int i=0;i<len/2;i++)
    //   	  {
    //   	    for(int j=0;j<10;j++)
    //		{
    //		   ss=res;
    //		   ss+=j+'0';
    //		   if(1==cmpstr(strmul(ss,ss),s,2*(len/2-i-1))); 		
    //		   {
    //		     res+=j-1+'0';	
    //		   	 break;
    //		   }		
    //		   if(j==9) res+='9';
    //		}		
    //	  }
    //   }
    //   else
    //   {
    //   	  for(int i=0;i<len/2+1;i++)
    //   	  {
    //   	    for(int j=0;j<10;j++)
    //		{
    //		   ss=res;
    //		   ss+=j+'0';
    //		   if(1==cmpstr(strmul(ss,ss),s,2*(len/2-i))); 		
    //		   {
    //		     res+=j-1+'0';	
    //		   	 break;
    //		   }		
    //		   if(j==9) res+='9';
    //		}		
    //	  }   	  
    //   }
    //   return res;	
    //	
    //} 
    int main()
    {
       string s1,s2;
       cin>>s1>>s2;
       cout<<strmul(sqrtStr(s1),sqrtStr(s2))<<endl;
       return 0;
    }
    

    //弱死了。。。。

  • 相关阅读:
    markdown语法
    GIT基本操作
    函数rest参数和扩展
    axios基础介绍
    Vue-Resource的使用
    Vue-router的介绍
    Vue2.0+组件库总结
    Vue 项目de一些准备工作
    VUE.js入门学习(5)- 插槽和作用域插槽
    VUE.js入门学习(4)-动画特效
  • 原文地址:https://www.cnblogs.com/qinjames/p/10554692.html
Copyright © 2020-2023  润新知