矩陣翻硬幣 藍橋杯 大數開方 大數相乘
隨後,小明對每一個硬幣分別進行一次 Q 操作。
對第x行第y列的硬幣進行 Q 操作的定義:將所有第 i*x 行,第 j*y 列的硬幣進行翻轉。
其中i和j為任意使操作可行的正整數,行號和列號都是從1開始。
// i、j為任意數
當小明對所有硬幣都進行了一次 Q 操作後,他發現了一個奇蹟——所有硬幣均為正面朝上。
小明想知道最開始有多少枚硬幣是反面朝上的。於是,他向他的好朋友小M尋求幫助。
聰明的小M告訴小明,只需要對所有硬幣再進行一次Q操作,即可恢復到最開始的狀態。然而小明很懶,不願意照做。於是小明希望你給出他更好的方法。幫他計算出答案。
對於20%的資料,n、m <= 10^7;
對於40%的資料,n、m <= 10^15;
對於10%的資料,n、m <= 10^1000(10的1000次方)。 思路 1. 如果一枚硬幣被翻了奇數次,那麼它原來的狀態肯定是反面朝上,所以,我們要找的就是被翻了奇數次的硬幣(立腳點) 2. Q 操作的定義:將所有第 i*x 行,第 j*y 列的硬幣進行翻轉。 正向看可能不好想,那麼我們反向看一下,假設一個橫座標為x的硬幣,在翻哪些硬幣的時候會翻到它呢? 其實就是這個數x所有的約數,比如橫座標為4的硬幣,那麼,在翻橫座標為1,2,4的硬幣時都會翻到它,縱座標的情況是一樣的。 3.對於一個硬幣,我們必須同時考慮其橫座標x和縱座標y,假如橫座標被翻了a次,縱座標被翻了b次,則這個硬幣總共被翻了a*b
- #include<iostream>
- #include<string>
- #include<cstring>
- using namespace std;
- string strMul(string a,string b)
- {
- string result="";
- int len1=a.length();
- int len2=b.length();
- int i,j;
- int num[500]={0};
- for(i=0;i<len1;i++)
- for(j=0;j<len2;j++)
- {
- num[len1-1+len2-1-i-j]=num[len1-1+len2-1-i-j]+(a[i]-'0')*(b[j]-'0');
- }
- //for(i=0;i<5;i++)
- //cout<<num[i]<<' ';
- //cout<<endl;
- for(i=0;i<len1+len2;i++)
- {
- num[i+1]=num[i+1]+num[i]/10;
- num[i]=num[i]%10;
- }
- //for(i=0;i<5;i++)
- //cout<<num[i]<<' ';
- for(i=len1+len2-1;i>=0;i--)
- {
- if(num[i]!=0)
- break;
- }
- for(;i>=0;i--)
- {
- result=result+(char)(num[i]+'0');
- }
- return result;
- }
- int strCmp(string a,string b,int pos)
- {
- int i;
- //cout<<a<<endl;
- //cout<<a.length()<<' '<<b.length()<<endl;
- if(a.length()+pos>b.length())
- return 1;
- if(a.length()+pos<b.length())
- return 0;
- if(a.length()+pos==b.length())
- {
- for(i=0;i<a.length();i++)
- {
- if(a[i]<b[i])
- return 0;
- if(a[i]==b[i])
- continue;
- if(a[i]>b[i])
- return 1;
- }
- }
- }
- string strSqrt(string a)
- {
- string result="";
- int i;
- int len=a.length();
- if(len%2==0)
- len=len/2;
- else
- len=len/2+1;
- for(i=0;i<len;i++)
- {
- result=result+'0';
- while(strCmp(strMul(result,result),a,2*(len-1-i))!=1)
- {
- if(result[i]==':')
- break;
- result[i]++;
- }
- result[i]--;
- }
- return result;
- }
- int main()
- {
- string n,m;
- cin>>n>>m;
- cout<<strMul(strSqrt(n),strSqrt(m))<<endl;
- //cout<<strMul("35","35")<<endl;
- //cout<<strCmp("1024","1200",0);
- //cout<<strSqrt("9801");
- return 0;
- }
相關推薦
矩陣翻硬幣 藍橋杯 大數開方 大數相乘
問題描述 小明先把硬幣擺成了一個 n 行 m 列的矩陣。 隨後,小明對每一個硬幣分別進行一次 Q 操作。 對第x行第y列的硬幣進行 Q 操作的定義:將所有第 i*x 行,第 j*y 列的硬幣進行翻轉。 其中i和j為任意使操作可行的正整數,行號和列號都是從1開始
藍橋杯:矩陣翻硬幣(大數開根號)
對於10%的資料,n、m <= 10^3; 對於20%的資料,n、m <= 10^7; 對於40%的資料,n、m <= 10^15; 對於10%的資料,n、m <= 10^1000(10的1000次方)。 我的思路:他是問翻之前有多少個硬幣是反面朝上的,所以這個反面朝上的
歷屆試題 矩陣翻硬幣 【java大數開方】
歷屆試題 矩陣翻硬幣 時間限制:1.0s 記憶體限制:256.0MB 問題描述 小明先把硬幣擺成了一個 n 行 m 列的矩陣。 隨後,小明對每一個硬幣分別進行一次 Q 操作。 對第x行第y列的硬幣進行 Q 操作的定義:將所有第 i*x 行,第
藍橋杯 矩陣翻硬幣(打表+二分)
網上其他人的答案好像都是用數學方法解決的。做這道題的時候一看就感覺是找規律的題,所以先打個表。因為後面要用到大數處理,所以是Java語言打表程式碼(就是按題目意思暴力):import java.io.FileNotFoundException; import java.io.
【藍橋杯題解】矩陣翻硬幣
歷屆試題 矩陣翻硬幣 時間限制:1.0s 記憶體限制:256.0MB 提交此題 問題描述 小明先把硬幣擺成了一個 n 行 m 列的矩陣。 隨後,小明對每一個硬幣分別進行一次 Q 操作。 對第x行第y列的硬幣進行 Q 操作的定義:將所有
藍橋杯_PREV-34_矩陣翻硬幣
問題描述 小明先把硬幣擺成了一個 n 行 m 列的矩陣。隨後,小明對每一個硬幣分別進行一次 Q 操作。對第x行第y列的硬幣進行 Q 操作的定義:將所有第 i*x 行,第 j*y 列的硬幣進行翻轉。其中i和j為任意使操作可行的正整數,行號和列號
藍橋杯 矩陣翻硬幣
article compare 畫蛇添足 equals http 等於 最大值 行號 兩個 矩陣翻硬幣 本文轉自 https://blog.csdn.net/xiaofengcanyuelong/article/details/79255105 小明先把硬幣擺成了一個
藍橋杯-矩陣翻硬幣
小明先把硬幣擺成了一個 n 行 m 列的矩陣。 隨後,小明對每一個硬幣分別進行一次 Q 操作。 對第x行第y列的硬幣進行 Q 操作的定義:將所有第 i*x 行,第 j*y 列的硬幣進行翻轉。 其中i和j為任意使操作可行的正整數,行號和列號都是從1開始。 當小明對所有硬幣都進行了一次 Q
藍橋杯歷屆試題----矩陣翻硬幣
矩陣翻硬幣問題描述小明先把硬幣擺成了一個 n 行 m 列的矩陣。隨後,小明對每一個硬幣分別進行一次 Q 操作。對第x行第y列的硬幣進行 Q 操作的定義:將所有第 i*x 行,第 j*y 列的硬幣進行翻轉。其中i和j為任意使操作可行的正整數,行號和列號都是從1開始。當小明對所有
矩陣翻硬幣 數學 藍橋杯
小明先把硬幣擺成了一個 n 行 m列的矩陣。隨後,小明對每一個硬幣分別進行一次 Q 操作。對第x行第y列的硬幣進行 Q 操作的定義:將所有第 i*x 行,第 j*y列的硬幣進行翻轉。其中i和j為任意使操作可行的正整數,行號和列號都是從1開始。 當小明對所有硬幣都進行了一次 Q操作後,他發現了一個
藍橋杯 演算法提高 大數加法
演算法提高 大數加法 時間限制:1.0s 記憶體限制:256.0MB 問題描述 輸入兩個正整數a,b,輸出a+b的值。 輸入格式 兩行,第一行a,第二行b。a和
矩陣翻硬幣
man 得出 ons 過大 字符 blog 過程 image 什麽 OJ鏈接:http://lx.lanqiao.cn/problem.page?gpid=T126 如果能理解其內在的含義,可以得40分保命: 保命代碼: #include <stdio.h>
矩陣翻硬幣(C++)
問題描述 小明先把硬幣擺成了一個 n 行 m 列的矩陣。 隨後,小明對每一個硬幣分別進行一次 Q 操作。 對第x行第y列的硬幣進行 Q 操作的定義:將所有第 i*x 行,第 j*y 列的硬幣進行翻轉。 其中i和j為任意使操作可行的正整數,
歷屆試題 矩陣翻硬幣
歷屆試題 矩陣翻硬幣 時間限制:1.0s 記憶體限制:256.0MB 問題描述 小明先把硬幣擺成了一個 n 行 m 列的矩陣。 隨後,小明對每一個硬幣分別進行一次 Q 操作。 對第x行第y列的硬幣進行 Q 操作的定義:將所有第 i*x
歷屆試題 矩陣翻硬幣
小明先把硬幣擺成了一個 n 行 m 列的矩陣。 隨後,小明對每一個硬幣分別進行一次 Q 操作。 對第x行第y列的硬幣進行 Q 操作的定義:將所有第 i*x 行,第 j*y 列的硬幣進行翻轉。 其中i和j為任意使操作可行的正整數,行號和列號都是從1開始。 當小明對所有硬幣都進行了一次 Q
第四屆藍橋杯第八題 翻硬幣
i++ nbsp ans namespace == pos else main 硬幣 題解:簡單貪心, 比賽之前寫寫水題 #include <iostream> #include <cstring> #include <strin
藍橋杯 翻硬幣 貪心
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
藍橋杯 演算法訓練 區間k大數查詢
明明是一個水題卻wrong answer了很多遍。。 還是因為對最基礎的氣泡排序概念不清。蠢死算了。 這下終於搞清楚了。 問題描述 給定一個序列,每次詢問序列中第l個數到第r個數中第K大的數是哪個。 輸入格式 第一行包含一個數
[Java] 藍橋杯ADV-136 演算法提高 大數加法
問題描述輸入兩個正整數a,b,輸出a+b的值。輸入格式兩行,第一行a,第二行b。a和b的長度均小於1000位。輸出格式一行,a+b的值。樣例輸入4 2樣例輸出6 package adv136; im
藍橋杯演算法題庫 區間k大數查詢
藍橋杯演算法題庫 區間k大數查詢 題目 解題思路 題目 問題描述 給定一個序列,每次詢問序列中第l個數到第r個數中第K大的數是哪個。 輸入格式 第一行包含一個數n,表示序列長度。 第二行包含n個正整數,表示給定的