zoukankan      html  css  js  c++  java
  • 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;
    }
    

    //弱死了。。。。

  • 相关阅读:
    多测师讲解html _伪类选择器17_高级讲师肖sir
    多测师讲解html _后代选择器16_高级讲师肖sir
    多测师讲解html _组合选择器_高级讲师肖sir
    多测师讲解html _标签选择器14_高级讲师肖sir
    前端 HTML form表单标签 input标签 type属性 重置按钮 reset
    前端 HTML form表单标签 textarea标签 多行文本
    前端 HTML form表单标签 input标签 type属性 file 上传文件
    前端 HTML form表单标签 input标签 type属性 radio 单选框
    前端 HTML form表单标签 input标签 type属性 checkbox 多选框
    前端 HTML form表单目录
  • 原文地址:https://www.cnblogs.com/qinjames/p/10554692.html
Copyright © 2011-2022 走看看