GDUFS 2018信息学院程序设计新手赛(正式赛)题解
緊張刺激的新手賽結(jié)束了……有驚無(wú)險(xiǎn)啊啊啊,雖然中途OJ炸了一次……很快就修復(fù),感謝大家耐心的等待!
謝謝大家!!!
題解開始前,先向大家道個(gè)歉,題目還是很多誤導(dǎo)人的地方,測(cè)評(píng)機(jī)崩了,導(dǎo)致很多人題沒過。接下來(lái)都會(huì)一一解釋……希望大家能理解……不過題目區(qū)分度還是達(dá)到了預(yù)期,有的同學(xué)表現(xiàn)也很搶眼。
?
Problem A: HELLO
Description
《絕地求生》(PUBG) 是一款戰(zhàn)術(shù)競(jìng)技型射擊類沙盒游戲 。 該游戲中,玩家需要在游戲地圖上收集各種資源,并在不斷縮小的安全區(qū)域內(nèi)對(duì)抗其他玩家,讓自己生存到最后。游戲《絕地求生》除獲得G-STAR最高獎(jiǎng)項(xiàng)總統(tǒng)獎(jiǎng)以及其他五項(xiàng)大獎(jiǎng) ,還打破了7項(xiàng)吉尼斯紀(jì)錄。小洪是這個(gè)游戲的狂熱愛好者,就在他今天準(zhǔn)備“吃雞”的時(shí)候他的舍友小權(quán)突然提醒他今天是新手賽!他果斷停止游戲,沖向?qū)嶒?yàn)室,輸入了今天的比賽地址222.201.101.7,但是他發(fā)現(xiàn)登不上網(wǎng)站!于是他向你求救!
Input
輸入只有一行,由不超過20個(gè)字符組成字符串,字符串僅由數(shù)字和字符“.”組成,判斷其是否是今天的比賽網(wǎng)址。
Output
如果是輸入的字符串是 "222.201.101.7" (不包括雙引號(hào)),那么輸出"Yes",否則輸出 "No"
Sample Input
222.201.101.5Sample Output
No難易度:?
題解:直接判斷即可
坑點(diǎn):注意字符數(shù)組判斷要用strcmp,不能直接==,如果要直接==就用string類
#include<iostream> using namespace std; int main(){string url;cin>>url;if(url=="222.201.101.7")cout<<"Yes";else cout<<"No";return 0; }?
Problem B: ORZ
Description
《英雄聯(lián)盟》(簡(jiǎn)稱LOL)是由美國(guó)拳頭游戲(Riot Games)開發(fā)、中國(guó)大陸地區(qū)騰訊游戲代理運(yùn)營(yíng)的英雄對(duì)戰(zhàn)MOBA競(jìng)技網(wǎng)游。游戲里擁有數(shù)百個(gè)個(gè)性英雄,并擁有排位系統(tǒng)、符文系統(tǒng)等特色養(yǎng)成系統(tǒng)。《英雄聯(lián)盟》還致力于推動(dòng)全球電子競(jìng)技的發(fā)展,除了聯(lián)動(dòng)各賽區(qū)發(fā)展職業(yè)聯(lián)賽、打造電競(jìng)體系之外,每年還會(huì)舉辦“季中冠軍賽”“全球總決賽”“All Star全明星賽”三大世界級(jí)賽事,獲得了億萬(wàn)玩家的喜愛,形成了自己獨(dú)有的電子競(jìng)技文化。小洪是英雄聯(lián)盟的狂熱愛好者,今天他決定學(xué)習(xí)三角形打野法。現(xiàn)在給你三條邊,小洪可以花費(fèi)一點(diǎn)法力讓某一條邊的長(zhǎng)度增加1,請(qǐng)問要使得這三條邊能組成三角形,最少需要多少法力?
Input
輸入只有一行,三個(gè)數(shù)字A,B,C,分別代表三條邊的長(zhǎng)度。
所有數(shù)字范圍為 (1~100)
Output
一個(gè)整數(shù),代表最少需要多少法力,才能使得這三條邊能組成一個(gè)三角形。
Sample Input
樣例輸入1: 3 4 5樣例輸入2: 2 3 5樣例輸入3: 100 10 10Sample Output
樣例輸出1: 0樣例輸出2: 1樣例輸出3: 81?
難易度:?
題解:三角形定理,任意兩邊之和大于第三遍即可。
坑點(diǎn):無(wú)
#include<bits/stdc++.h> using namespace std; const int MAXN=100005; typedef long long ll;int a[3];int main(){scanf("%d%d%d",&a[0],&a[1],&a[2]);sort(a,a+3);if(a[0]+a[1]>a[2]){cout<<0<<endl;}else{cout<<a[2]-a[0]-a[1]+1<<endl;}return 0; }?
Problem C: NIGHTMARE
Description
《陰陽(yáng)師》是由中國(guó)網(wǎng)易移動(dòng)游戲公司自主研發(fā)的3D日式和風(fēng)回合制RPG手游。2016年6月1日11:00,《陰陽(yáng)師》開放安卓首測(cè)? ;同年9月2日,登陸ios平臺(tái)于App Store首發(fā) ;同年9月9日,陰陽(yáng)師全平臺(tái)公測(cè) 。游戲中的和風(fēng)元素是以《源氏物語(yǔ)》的古日本平安時(shí)代為背景設(shè)計(jì)的。游戲劇情以日本平安時(shí)代為背景,講述了陰陽(yáng)師安倍晴明于人鬼交織的陰陽(yáng)兩界中,探尋自身記憶的故事 。小洪是陰陽(yáng)師的狂熱愛好者,今天他十連抽的時(shí)候抽到了3個(gè)SSR!于是他決定開個(gè)Party慶祝。在party中,有一個(gè)大Pizza~小洪要把它平均的分給N個(gè)小伙伴(包括他自己),那么小洪最少要切多少刀呢?我們假設(shè) Pizza是圓的,并且不能傷害自己的小伙伴-_-||
Input
輸入只有一行,一個(gè)數(shù)字N,代表Party中有N個(gè)小伙伴。
所有數(shù)字范圍為 (1~100)
Output
要平均分的最少刀數(shù)
Sample Input
樣例輸入1: 1樣例輸入2: 3樣例輸入3: 4Sample Output
樣例輸出1: 0樣例輸出2: 3樣例輸出3: 2?
難易度:?
題解:思維題,偶數(shù)輸出N/2,奇數(shù)輸出N,1輸出0
坑點(diǎn):樣例都給出來(lái)了,無(wú)坑點(diǎn)
#include <bits/stdc++.h> using namespace std; int main(){int N;scanf("%d",&N);if(N==1)cout<<0<<endl;else if(N%2==1)cout<<N<<endl;elsecout<<N/2<<endl;return 0; }?
Problem D: GAME
Description
《糖果傳奇》是由King開發(fā)的一款微策略消除手游,于2014年8月發(fā)行。游戲設(shè)置了超過500關(guān)的關(guān)卡,在游戲中,玩家可以通過三個(gè)或三個(gè)以上的糖果以不同方式的連接消除得分,碰撞開不同的障礙物完成任務(wù)。小洪是糖果傳奇的狂熱愛好者。他和他的女朋友都特別喜歡這個(gè)游戲,現(xiàn)在他們相約在某個(gè)地方一起玩這個(gè)游戲。我們假設(shè)他們的家在一個(gè)X軸上。小洪的家在 X1=a的位置,他女朋友在X2=b的位置。每個(gè)人都可以在X軸上行走任意多次。當(dāng)一個(gè)人移動(dòng)一次的時(shí)候,他的疲勞值會(huì)改變,疲勞值改變的規(guī)則如下:
第一次移動(dòng)疲勞值增加1,第二次移動(dòng)疲勞值增加2,第三次移動(dòng)疲勞值增加3……舉個(gè)例子,小洪往右走了一步,再往左走了一步(回到初始位置),再往右走了一步,那么他一共走了三步,那么他的疲勞值為 1+2+3=6.
他們倆人會(huì)在某個(gè)整點(diǎn)相遇,請(qǐng)你幫他們計(jì)算,他們要相遇的最少的疲勞值之和。
Input
輸入有兩行,第一行1數(shù)字 a,代表小洪的初始位置
第二行一個(gè)數(shù)字b,代表他女朋友的初始位置
所有的數(shù)字范圍為 (1~1000)
Output
讓他們相遇的最少的疲勞值之和。
Sample Input
樣例輸入1: 3 4樣例輸入2: 101 99樣例輸入3: 5 10Sample Output
樣例輸出1: 1樣例輸出2: 2樣例輸出3: 9?
難易度:??
題解:簡(jiǎn)單思維,實(shí)際上,平均走是最優(yōu)的,所以我們只要算出中點(diǎn),然后直接計(jì)算即可。
坑點(diǎn):看你能不能想得出來(lái)。
#include <iostream> #include <algorithm> #include <string.h> #include <vector> #include <memory.h> #include <bitset> #include <map> #include <deque> #include <math.h> #include <stdio.h> using namespace std; int main() {int a,b;cin>>a>>b;int m=(a+b)/2;if(a>b)swap(a,b);long long int ans=0;for(int i=1;i<1000;i++){if(a==m)break;ans+=i;a++;}for(int i=1;i<1000;i++){if(b==m)break;ans+=i;b--;}cout<<ans<<endl;return 0; }?
Problem E: ROAL
Description
《osu!》是一款基于《押忍!戰(zhàn)斗!應(yīng)援團(tuán)》、《精英節(jié)拍特工》和《太鼓達(dá)人》等商業(yè)游戲改編的免費(fèi)同人音樂游戲,由Peppy (Dean Herbert)開發(fā)制作。小洪是osu狂熱愛好者。但是他今天想打鋤大地,在他的世界中。牌是沒有花色的。現(xiàn)在給你5張牌(1~13),要你判這五張牌能否組成順子,葫蘆,金剛
順子:五張牌是連續(xù)的,如1 2 3 4 5,5 6 7 8 9,9 10 11 12 13,10 11 12 13 1是順子,但是11 12 13 1 2和 12 13 1 2 3和13 1 2 3 4 不算順子。
葫蘆:三張帶一對(duì)。如,1 1 1 2 2,5 5 5 6 6,11 11 11 13 13.
金剛:四張帶一個(gè)。如1 1 1 1 2,13 13 13 13 1.
Input
輸入只有一行,每行5個(gè)數(shù)字,代表5張牌,數(shù)字的范圍為(1~13)題目保證數(shù)字出現(xiàn)的次數(shù)不會(huì)超過4次。
Output
如果是順子輸出“shunzi”
如果是葫蘆輸出“hulu”
如果是金剛輸出“jingang”
如果都不是輸出“l(fā)anpai”
Sample Input
樣例輸入1: 10 11 12 1 13樣例輸入2: 5 5 5 5 4樣例輸入3: 5 5 5 4 4樣例輸入4: 11 12 13 1 2Sample Output
樣例輸出1: shunzi樣例輸出2: jingang樣例輸出3: hulu樣例輸出4: lanpai?
難易度:??
題解:無(wú)
坑點(diǎn):仔細(xì)讀題,另外善用排序。
#include <iostream> #include <algorithm> #include <string.h> #include <vector> #include <memory.h> #include <set> #include <map> #include <deque> #include <math.h> #include <stdio.h> using namespace std; int main() {int a[5];for(int i=0;i<5;i++)scanf("%d",&a[i]);sort(a,a+5);map<int,int> s;for(int i=0;i<5;i++)s[a[i]]++;if((a[0]==a[1]-1&&a[1]==a[2]-1&&a[2]==a[3]-1&&a[3]==a[4]-1)||(a[0]==1&&a[1]==10&&a[2]==11&&a[3]==12&&a[4]==13))printf("shunzi\n");else if(s.size()==2&&(s.begin()->second==2||s.begin()->second==3))printf("hulu\n");else if(s.size()==2&&(s.begin()->second==1||s.begin()->second==4))printf("jingang\n");elseprintf("lanpai\n");return 0; }?
Problem F: OMG
Description
《中國(guó)式家長(zhǎng)》是一款由墨魚玩游戲開發(fā)的模擬養(yǎng)成游戲,游戲已經(jīng)上架steam、wegame于2018年9月29日正式發(fā)售。
《中國(guó)式家長(zhǎng)》是一款現(xiàn)實(shí)主義的模擬游戲,游戲模擬從出生到高考的整段過程,探討中國(guó)孩子與家長(zhǎng)之間的關(guān)系。2018年10月,《中國(guó)式家長(zhǎng)》的游戲在網(wǎng)絡(luò)上引發(fā)熱議。該游戲銷售剛滿一個(gè)月,已經(jīng)在一家知名游戲商城上取得全球周銷量排行第2名。小洪是中國(guó)式家長(zhǎng)的狂熱愛好者。今天他決定讓他的孩子小洲上清華!已知小洲高考的分?jǐn)?shù),請(qǐng)你計(jì)算一下他某幾科科目的分?jǐn)?shù)和!我們假設(shè)在游戲的世界中,高考科目有很多,然后小洪會(huì)讓你查詢某個(gè)區(qū)間的分?jǐn)?shù)和。
Input
輸入有多行,第一行兩個(gè)數(shù)字N和Q,代表游戲世界中有N個(gè)科目和小洪會(huì)問你Q個(gè)問題。第二行包括N個(gè)數(shù)字,由空格隔開,每個(gè)數(shù)字代表小洲一科的高考分?jǐn)?shù)Ai。
接下來(lái)有Q行,每行包括兩個(gè)數(shù)字L和R,代表小洪要你告訴他這N個(gè)科目中,從第L個(gè)到第R個(gè)科目的分?jǐn)?shù)的和
(1<=Ai<=100)
(1<=N<=100000)
(1<=Q<=100000)
(1<=L<=R<=N)
Output
對(duì)于每個(gè)查詢,輸出一個(gè)數(shù)字,代表該次查詢的分?jǐn)?shù)和。每個(gè)數(shù)字占一行。
Sample Input
樣例輸入1: 5 3 1 2 3 4 5 1 2 2 4 1 5樣例輸入2: 5 5 100 99 98 1 2 1 1 2 2 4 5 1 5 3 5Sample Output
樣例輸出1: 3 9 15樣例輸出2: 100 99 3 300 101難易度:???
題解:很多人以為是簡(jiǎn)單題,然后直接算,其實(shí)這樣的時(shí)間復(fù)雜度是不可以接受的,所以很多人都收到了Runtime Error和Time Limited? Exceed錯(cuò)誤。所以我們要優(yōu)化我們的算法。這里引入一個(gè)前綴和的概念。假設(shè)前i項(xiàng)的和為sum[i],那么我們要計(jì)算L~R的和就只需要一個(gè)公式,sum[R] - sum[L-1] 即可。為啥這樣可以,自己思考。然后對(duì)于每一個(gè)sum[i]我們預(yù)處理出來(lái)即可。
坑點(diǎn):暴力算會(huì)超時(shí)
#include<bits/stdc++.h> using namespace std; int a[1000005]; int sum[1000005]; int main() {int N,Q;scanf("%d%d",&N,&Q);for(int i=1;i<=N;i++){scanf("%d",&a[i]);sum[i]=sum[i-1]+a[i];}int L,R;while(Q--){scanf("%d%d",&L,&R);printf("%d\n",sum[R]-sum[L-1]);}return 0; }?
Problem G: CRAWLING
Description
《太吾繪卷》是ConchShip Games研發(fā)的一款以神話和武俠為題材的獨(dú)立游戲。玩家將扮演神秘的“太吾氏傳人”。
在《太吾繪卷》的世界中,你除了需要扮演神秘的“太吾氏傳人”,還將以不同的處世立場(chǎng)——或善、或惡、或中庸——投身于紛繁復(fù)雜的江湖之中。你不僅可以拜訪世界各地的武林門派,學(xué)習(xí)種類繁多的功法絕藝;還可以與人義結(jié)金蘭,或結(jié)下血海深仇;不僅可以興建自己的村莊,經(jīng)營(yíng)各種產(chǎn)業(yè);還可以與自己的摯愛生兒育女,緣定三生;直到你終于面對(duì)太吾氏的宿敵,擊敗相樞劍冢,決定世界的命運(yùn)!小洪是太吾繪卷的狂熱愛好者,同時(shí)他也很喜歡研究集合問題,最近他在研究邪惡集合,所謂邪惡集合,就是如果這個(gè)集合里不存在的最小的非負(fù)整數(shù)是X,那么這個(gè)集合就是邪惡的。現(xiàn)在小洪手里有一個(gè)集合,他想把他變成邪惡集合,每一步小洪可以刪掉集合里一個(gè)數(shù),或者往集合里添加添加一個(gè)數(shù),請(qǐng)問小洪最少需要多少步,才能使得這個(gè)集合變成邪惡集合!
Input
輸入有兩行,第一行兩個(gè)數(shù)字 N,X,代表初始集合的大小 ,和題目中的X
第二行包括N個(gè)各不相同的數(shù)字,代表集合初始的N個(gè)數(shù)字
所有的數(shù)字范圍為 (1~10000)
Output
要把這個(gè)集合變成邪惡集合的最少步數(shù)
Sample Input
樣例輸入1: 5 3 0 4 5 6 7樣例輸入2: 5 1 1 2 3 4 5樣例輸入3: 1 0 0Sample Output
樣例輸出1: 2樣例輸出2: 2樣例輸出3: 1難易度:???
題解:邏輯題,實(shí)際上我在樣例解釋中已經(jīng)解釋得很清楚了。我們只需要計(jì)算缺了多少個(gè)數(shù)和多了多少個(gè)數(shù)即可。
坑點(diǎn):注意非負(fù)整數(shù)包括0.
#include<bits/stdc++.h> using namespace std; int a[200]; int main(){int n,m;cin>>n>>m;for(int i=0;i<n;i++)cin>>a[i];int i;int num=0;//計(jì)算集合里比M小的數(shù)有多少個(gè),直接枚舉每一個(gè)數(shù)看看集合里有沒有for(i=0;i<m;i++){for(int j=0;j<n;j++){if(a[j]==i){num++;}}}//看看有沒有跟M大小一個(gè)的數(shù),有的話需要一個(gè)刪除操作。這里aaa要么0要么1.int aaa=0;for(int j=0;j<n;j++){if(a[j]==m){aaa++;}}//答案cout<<m-num+aaa<<endl;return 0; }?
Problem H: KINGDOM
Description
《王者榮耀》是由騰訊游戲天美工作室群開發(fā)并運(yùn)行的一款運(yùn)營(yíng)在Android、IOS、NS平臺(tái)上的MOBA類手機(jī)游戲,于2015年11月26日在Android、IOS平臺(tái)上正式公測(cè)。小洪是王者榮耀的狂熱愛好者,但是他最近玩膩了,決定返璞歸真,折紙飛機(jī)玩。他還邀請(qǐng)了他的ACM的小伙伴們一起玩耍。已知每張紙能夠折S個(gè)紙飛機(jī),現(xiàn)在有K個(gè)小伙伴,每個(gè)小伙伴要折N個(gè)紙飛機(jī)。但是紙只能一包一包的買,已知每包紙有包含P張紙。現(xiàn)在要把紙分給每一個(gè)小伙伴,使得每個(gè)小伙伴都有足夠的紙去折屬于他的N個(gè)紙飛機(jī),那么請(qǐng)問,他們最少要買多少包紙?注意,紙是不能共享的喔~
Input
輸入只有一行,每行4個(gè)數(shù)字,用空格隔開,分別為? K,N,S,P,每個(gè)數(shù)字所代表的的意思見上述題面。
所有數(shù)字范圍為 (1~10000)
Output
一個(gè)數(shù)字,代表最少要買多少包紙。
Sample Input
樣例輸入1: 5 3 2 3樣例輸入2: 5 3 100 1Sample Output
樣例輸出1: 4樣例輸出2: 5難易度:??
題解:小學(xué)數(shù)學(xué)題,直接算即可。
坑點(diǎn):注意取整問題,和變量名字別搞錯(cuò)
#include<bits/stdc++.h> using namespace std; int k,n,s,p; int main() {cin>>k>>n>>s>>p;cout<<(int)(ceil((int)(ceil(n/(double)(s)))*k/(double)(p)))<<endl;return 0; }?
Problem I: NECKLACE
Description
Codeforces是一家為計(jì)算機(jī)編程愛好者提供在線評(píng)測(cè)系統(tǒng)的俄羅斯網(wǎng)站。該網(wǎng)站由薩拉托夫國(guó)立大學(xué)的一個(gè)團(tuán)體創(chuàng)立并負(fù)責(zé)運(yùn)營(yíng)。
小洪是Codeforces的狂熱愛好者,今天他決定打CF,今天CF的簽到題非常簡(jiǎn)單,他決定讓你們來(lái)做~幸運(yùn)的是,小洪已經(jīng)幫你們翻譯好題目了。已知一個(gè)字符串,讓你求這個(gè)字符串的所有不同的非空子串的長(zhǎng)度乘以該子串出現(xiàn)的次數(shù)的和。以下是具體解釋
子串:串中任意個(gè)連續(xù)的字符組成的子序列稱為該串的子串,比如有一個(gè)串 ababacab,以下串都是他的子串
ab(出現(xiàn)了三次),a(出現(xiàn)了四次),aba(出現(xiàn)了兩次),bab,ababcab(出現(xiàn)了一次)等
不同的子串:比如有一個(gè)串 ababcab,以下串都是他不同的子串
ab,a,aba,bab,ababcab,c等
子串的長(zhǎng)度:即該子串的字符個(gè)數(shù),如aba的長(zhǎng)度為3,a的長(zhǎng)度為1.
Input
輸入只有一行,包括一個(gè)只由小寫字母組成的字符串
字符串的長(zhǎng)度為 (1~1000)
Output
這個(gè)字符串的所有不同的非空子串的長(zhǎng)度乘以該子串出現(xiàn)的次數(shù)的和
Sample Input
樣例輸入1: a樣例輸入2: aba樣例輸入3: ababSample Output
樣例輸出1: 1樣例輸出2: 10樣例輸出3: 20HINT
?
對(duì)于aba他的所有不同的子串有
?
a(出現(xiàn)了兩次)
?
b(出現(xiàn)了一次)
?
ab(出現(xiàn)了一次)
?
ba(出現(xiàn)了一次)
?
aba(出現(xiàn)了一次)
?
所以總的答案為 1*2+1*1+2*1+2*1+3*1 = 10
?
?
?
對(duì)于abab,他的所有不同的子串有
?
a(出現(xiàn)了兩次)
?
b(出現(xiàn)了兩次)
?
ab(出現(xiàn)了兩次)
?
ba(出現(xiàn)了一次)
?
aba(出現(xiàn)了一次)
?
bab(出現(xiàn)了一次)
?
abab(出現(xiàn)了一次)
?
所以答案為 1*2+1*2 +2*2+2*1+3*1+3*1+4*1 = 20
?
難易度:????
題解:題目要求的是,一個(gè)字符串中,所有不同的子串出現(xiàn)的次數(shù)乘以他的長(zhǎng)度的和。乍一看很難的樣子,實(shí)際上我們只需要稍作分析,就會(huì)發(fā)現(xiàn)其實(shí)是一個(gè)簡(jiǎn)單題。我們把不同的子串出現(xiàn)的次數(shù)這個(gè)限制去掉,改成所有子串出現(xiàn)的次數(shù)乘以他的長(zhǎng)度的和。那么我們就會(huì)發(fā)現(xiàn),每一個(gè)子串出現(xiàn)的次數(shù)都是1次。所以答案就會(huì)變成一個(gè)很簡(jiǎn)單的公式了。我們假設(shè)原字符串長(zhǎng)度為N,那么答案就是,長(zhǎng)度為N的子串有一個(gè),長(zhǎng)度為N-2的子串有兩個(gè),長(zhǎng)度為N-3的子串有三個(gè)。。。然后直接計(jì)算出和即可。
#include <iostream> #include <algorithm> #include <string.h> #include <vector> #include <memory.h> #include <set> #include <map> #include <deque> #include <math.h> #include <stdio.h> using namespace std; int main() {string str;cin>>str;int N=str.length();int sum=0;for(int i=1;i<=N;i++){sum+=i*(N-i+1);}printf("%d\n",sum);return 0; }?
Problem J: BECAUSE
Description
CTF(Capture The Flag)中文一般譯作奪旗賽,在網(wǎng)絡(luò)安全領(lǐng)域中指的是網(wǎng)絡(luò)安全技術(shù)人員之間進(jìn)行技術(shù)競(jìng)技的一種比賽形式。CTF起源于1996年DEFCON全球黑客大會(huì),以代替之前黑客們通過互相發(fā)起真實(shí)攻擊進(jìn)行技術(shù)比拼的方式。發(fā)展至今,已經(jīng)成為全球范圍網(wǎng)絡(luò)安全圈流行的競(jìng)賽形式,2013年全球舉辦了超過五十場(chǎng)國(guó)際性CTF賽事。小洪是ACM的狂熱愛好者,但是他也業(yè)余打打CTF,CTF涉及密碼學(xué),在密碼學(xué)中素?cái)?shù)是非常重要的一個(gè)東西,今天小洪在打CTF的時(shí)候,遇到了一個(gè)非常有意思的題目,他決定用ACM的方法去解決它,題目大意是這樣的,給你一個(gè)正整數(shù)N,要你求出所有滿足方程 1/X + 1/Y = 1/N 的正整數(shù)解的個(gè)數(shù),即X>0,Y>0的解的個(gè)數(shù)。小洪已經(jīng)解出了這道題目,他決定考考你,看看你是否也能解出來(lái)~
Input
輸入有包括一行,一個(gè)正整數(shù)N
所有的數(shù)字范圍為 (1<=N<=1000000000)(1后面9個(gè)0)
Output
滿足方程 1/X + 1/Y = 1/N 的正整數(shù)解的個(gè)數(shù),其中X<=Y
Sample Input
樣例輸入1: 1樣例輸入2: 3樣例輸入3: 20180101樣例輸入4: 1000000000Sample Output
樣例輸出1: 1樣例輸出2: 2樣例輸出3: 5樣例輸出4: 181?
難易度:????????
解題思路:這實(shí)際上是一道數(shù)學(xué)題,直接百度1/X + 1/Y = 1/N 即可找到詳細(xì)題解。https://www.cnblogs.com/GHzz/p/8644625.html
坑點(diǎn):要會(huì)因式分解公式
#include<iostream> using namespace std; typedef long long int ll; int main(){ll n;cin>>n;n=n*n;ll sum = 1;for(ll i = 2; i*i <= n; i++){int cou = 0;if(n%i==0){cou = 1;n /= i;while(n%i==0){cou++;n /= i;}}if(cou != 0){sum = sum*(cou+1);}}if(n != 1){sum = sum*2;//剩下一個(gè)質(zhì)數(shù)(1+1)}if(sum==1 && n==1){sum = 1;}cout<<(sum-1)/2+1<<endl;return 0; }?
總結(jié)
以上是生活随笔為你收集整理的GDUFS 2018信息学院程序设计新手赛(正式赛)题解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php顺序结构例题,php顺序结构就象一
- 下一篇: 什么是CMM