矩陣翻硬幣

今天再看藍橋杯的時候铣墨,看見一道有趣的貪心題。

問題描述
  小明先把硬幣擺成了一個 n 行 m 列的矩陣办绝。

  隨后踏兜,小明對每一個硬幣分別進行一次 Q 操作。

  對第x行第y列的硬幣進行 Q 操作的定義:將所有第 i*x 行八秃,第 j*y 列的硬幣進行翻轉。

  其中i和j為任意使操作可行的正整數(shù)肉盹,行號和列號都是從1開始昔驱。

  當小明對所有硬幣都進行了一次 Q 操作后,他發(fā)現(xiàn)了一個奇跡——所有硬幣均為正面朝上上忍。

  小明想知道最開始有多少枚硬幣是反面朝上的骤肛。于是纳本,他向他的好朋友小M尋求幫助。

  聰明的小M告訴小明腋颠,只需要對所有硬幣再進行一次Q操作繁成,即可恢復到最開始的狀態(tài)。然而小明很懶淑玫,不愿意照做巾腕。于是小明希望你給出他更好的方法。幫他計算出答案絮蒿。
輸入格式
  輸入數(shù)據(jù)包含一行尊搬,兩個正整數(shù) n m,含義見題目描述土涝。
輸出格式
  輸出一個正整數(shù)佛寿,表示最開始有多少枚硬幣是反面朝上的。
樣例輸入
2 3
樣例輸出
1
數(shù)據(jù)規(guī)模和約定
  對于10%的數(shù)據(jù)但壮,n冀泻、m <= 10^3;
  對于20%的數(shù)據(jù)蜡饵,n弹渔、m <= 10^7;
  對于40%的數(shù)據(jù)验残,n捞附、m <= 10^15;
  對于10%的數(shù)據(jù)您没,n鸟召、m <= 10^1000(10的1000次方)。

可以知道氨鹏,假設是一個(1欧募,m)的矩陣,那么某個硬幣被翻的次數(shù)是由它所在的位置決定的仆抵,假設一個硬幣位置為(1跟继,6)那么,在翻(1镣丑,1)舔糖,(1,2)莺匠,(1金吗,3)時都會被翻一次,加上其自身,翻到的次數(shù)就是四次摇庙;最后狀態(tài)不變旱物。如果一個硬幣的位置是(1,5)卫袒,那么翻(1宵呛,1),(1夕凝,5)的時候被翻轉宝穗;結果狀態(tài)不變。如果是(1迹冤,9)讽营,那么(1,1)泡徙,(1橱鹏,3),(1堪藐,9)時翻轉莉兰,狀態(tài)改變。相同礁竞,如果是(1糖荒,4),狀態(tài)也會改變模捂,其原因就是該數(shù)的兩個約數(shù)相等捶朵,所以減少了一次翻轉的機會。所以對于這個行數(shù)為1的矩陣狂男,狀態(tài)被改變的數(shù)目也就是在m以內所有可開方數(shù)的數(shù)目和综看,我們只要知道m(xù)以內有多少個數(shù)可以寫成m=k^2的方式即可。
我們假設m=30岖食,那么最大的看開方數(shù)是5(5^2=25)红碑,所以,就必定存在4泡垃,3析珊,2,1四個可開方數(shù)蔑穴,結合上面的推論忠寻,有5個硬幣的狀態(tài)被改變,最初共有5個反面的硬幣存和。
在我們計算的時候锡溯,只需要求出一個數(shù)的最大可開方數(shù)取整赶舆,即是可開方數(shù)的個數(shù)。

將范圍擴大到(n祭饭,m),這時要考慮的是行數(shù)增加的影響叙量,若位置是(2倡蝙,9)绞佩,該硬幣不但會在(2寺鸥,1),(2品山,3)胆建,(2,9)時被翻轉三次肘交,還會在(1笆载,1),(1涯呻,3)凉驻,(1,9)時被翻轉复罐,故在行涝登,列,位置都是不可開方數(shù)的時候才會出現(xiàn)狀態(tài)改變效诅,設n胀滚,m的可開方數(shù)目分別為i,j乱投,那么該矩陣的總反面硬幣個數(shù)為i與j的積咽笼。

因此我們的計算方法為:
1,尋找兩個數(shù)的最大可開方數(shù)
2篡腌,將最大可開方數(shù)相乘

具體實現(xiàn)涉及到了大數(shù)的計算褐荷,字符串的應用問題,在這里就不多說了嘹悼。具體代碼演示:

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


string multiply(string str1,string str2)//字符串相乘函數(shù) 
{
string str="";  //最終結果 
int len1=str1.size(),len2=str2.size(),i,j;//計算兩個字符串的函數(shù) 
int result[1000]={0};  //開辟數(shù)組存乘積并初始化 
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--)//讓數(shù)組的每一位都是正確的數(shù) 
{
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)//字符串比較函數(shù) 
{
    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)//對字符串開方取整函數(shù) 
{
int len=str.size();
string str1="",str2="";
for(int i=0;i<(len+1)/2;i++)//若len為偶數(shù)叛甫,len/2=(len+1)/2;若len為奇數(shù),len/2+1=(len+1)/2 
       for(int j=0;j<=9;j++)   //因為每一位的數(shù)值都是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;
}

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末其监,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子限匣,更是在濱河造成了極大的恐慌抖苦,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異锌历,居然都是意外死亡贮庞,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門究西,熙熙樓的掌柜王于貴愁眉苦臉地迎上來窗慎,“玉大人,你說我怎么就攤上這事卤材≌诔猓” “怎么了?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵扇丛,是天一觀的道長术吗。 經常有香客問我,道長帆精,這世上最難降的妖魔是什么较屿? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮实幕,結果婚禮上吝镣,老公的妹妹穿的比我還像新娘。我一直安慰自己昆庇,他們只是感情好末贾,可當我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著整吆,像睡著了一般拱撵。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上表蝙,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天拴测,我揣著相機與錄音,去河邊找鬼府蛇。 笑死集索,一個胖子當著我的面吹牛,可吹牛的內容都是我干的汇跨。 我是一名探鬼主播务荆,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼屿讽,長吁一口氣:“原來是場噩夢啊……” “哼紧武!你這毒婦竟也來了?” 一聲冷哼從身側響起耍目,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤蚪黑,失蹤者是張志新(化名)和其女友劉穎盅惜,沒想到半個月后中剩,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡抒寂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年结啼,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蓬推。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡妆棒,死狀恐怖,靈堂內的尸體忽然破棺而出沸伏,到底是詐尸還是另有隱情,我是刑警寧澤动分,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布毅糟,位于F島的核電站,受9級特大地震影響澜公,放射性物質發(fā)生泄漏姆另。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一坟乾、第九天 我趴在偏房一處隱蔽的房頂上張望迹辐。 院中可真熱鬧,春花似錦甚侣、人聲如沸明吩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽印荔。三九已至,卻和暖如春详羡,著一層夾襖步出監(jiān)牢的瞬間仍律,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工实柠, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留水泉,地道東北人。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓窒盐,卻偏偏與公主長得像草则,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子登钥,可洞房花燭夜當晚...
    茶點故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內容