---
title: CPE二星筆記
tags: C++, CPE, Program, code
---
# CPE二星筆記:pencil:
---
## 目錄
| 001~100 | | 101~200 | | 201~300 | |
| ------- | --- | ------- | --- | ------------------------------ | --------------------------------------- |
| 151 | | 10233 | | 11043 | |
| 245 | | 10236 | | 11051 | |
| 255 | | 10238 | | 11056 | |
| 294 | | 10252 | | 11057 | |
| 337 | | 10256 | | 11067 | |
| 374 | | 10263 | | 11076 | |
| 378 | | 10264 | | 11078 | |
| 397 | | 10266 | | 11086 | |
| 406 | | 10267 | | 11093 | |
| 495 | | 10283 | | 11094 | |
| 514 | | 10284 | | 11096 | |
| 516 | | 10286 | | 11115 | |
| 534 | | 10287 | | 11121 | |
| 536 | | 10289 | | 11157 | |
| 540 | | 10293 | | 11235 | |
| 572 | | 10295 | | 11241 | |
| 612 | | 10297 | | 11264 | |
| 657 | | 10298 | | 11286 | |
| 674 | | 10299 | | 11287 | |
| 679 | | 10301 | | 11308 | |
| 686 | | 10302 | | 11326 | |
| 696 | | 10305 | | 11335 | |
| 722 | | 10311 | | 11340 | |
| 748 | | 10312 | | 11344 | |
| 821 | | 10315 | | 11348 | |
| 900 | | 10322 | | 11350 | |
| 924 | | 10325 | | 11360 | |
| 967 | | 10327 | | 11369 | |
| 991 | | 10333 | | 11396 | |
| 993 | | 10334 | | 11403 | |
| 997 Show the Sequence | [link](#997_Show_the_Sequence) | 10336 | | 11412 | |
| 1200 | | 10338 | | 11417 |[link](#11417_GCD) |
| 1210 | | 10339 | | 11418 | |
| 1262 | | 10341 | | 11462 | |
| 1644 | | 10343 | | 11475 | |
| 1730 | | 10344 | | 11480 | |
| 1753 | | 10345 | | 11484 | |
| 10001 | | 10347 | | 11505 | |
| 10002 | | 10348 | | 11507 | |
| 10004 Bicoloring |[link](#10004_Bicoloring) | 10352 | | 11508 | |
| 10006 | | 10360 | | 11515 | |
| 10009 | | 10368 | | 11518 | |
| 10010 | | 10371 | | 11519 | |
| 10013 Super long sums | [link](#10013_Super_long_sums) | 10372 | | 11520 | |
| 10014 | | 10382 | | 11536 | |
| 10015 | | 10405 | | 11538 | |
| 10016 | | 10406 | | 11550 | |
| 10017 | | 10407 | | 11583 | |
| 10020 | | 10408 | | 11586 | |
| 10028 | | 10427 | | 11609 | |
| 10034 | | 10432 | | 11614 | |
| 10039 | | 10440 | | 11615 | |
| 10040 | | 10450 | | 11616 | |
| 10060 | | 10466 | | 11629 | |
| 10061 | | 10489 | | 11683 | |
| 10063 | | 10494 | | 11692 | |
| 10064 | | 10497 | | 11703 | |
| 10066 | | 10504 | | 11714 | |
| 10070 | | 10508 | | 11729 | |
| 10077 | | 10523 | | 11730 | |
| 10098 | | 10527 | | 11742 | |
| 10100 | | 10535 | | 11847 | |
| 10102 | | 10555 | | 11849 | |
| 10104 | | 10563 | | 11850 | |
| 10106 | | 10579 | | 11879 | |
| 10107 | | 10583 | | 11898 | |
| 10110 | | 10596 | | 11953 | |
| 10114 | | 10608 | | 11957 | |
| 10115 | | 10611 | | 11991 | |
| 10116 | | 10625 | | 11995 | |
| 10125 | | 10666 | | 11997 | |
| 10127 | | 10670 | | 12160 | |
| 10137 | | 10673 | | 12207 | |
| 10138 | | 10684 | | 12382 | |
| 10140 | | 10700 | | 12406 Help Dexter | [link](#12406_Help_Dexter) |
| 10141 | | 10718 | | 12455 Bars | [link](#12455_Bars) |
| 10145 | | 10738 | | 12592 Slogan Learning of Princess | [link](#12592_Slogan_Learning_of_Princess) |
| 10142 | | 10730 | | 12545 Bits Equalizer | [link](#12545_Bits_Equalizer) |
| 10146 | | 10763 | | 12694 Meeting Room Arrangement | [link](#12694_Meeting_Room_Arrangement) |
| 10152 | | 10815 | | 12705 Breaking Board | [link](#12705_Breaking_Board) |
| 10160 | | 10820 | | 12797 Letters | [詳解](#12797_Letters) |
| 10161 | | 10858 | | 12844 | |
| 10167 | | 10871 | | 13185 DPA Numbers I | [詳解](#13185_DPA_Numbers_I) |
| 10172 | | 10881 | | 13194 DPA Numbers II | [詳解](#13194_DPA_Numbers_II) |
| 10174 | | 10887 | | | |
| 10176 | | 10901 | | | |
| 10180 | | 10902 | | | |
| 10182 | | 10910 | | | |
| 10192 | | 10915 | | | |
| 10193 | | 10916 | | | |
| 10194 | | 10920 | | | |
| 10195 | | 10924 | | | |
| 10196 | | 10926 | | | |
| 10197 | | 10930 | | | |
| 10200 | | 10936 | | | |
| 10205 | | 10940 | | | |
| 10220 | | 10959 | | | |
| 10223 | | 11013 | | | |
| 10225 | | 11039 | | | |
| 10227 | | 11040 | | | |
---
## 151
## 245
## 255
## 294
## 337
## 374
## 378
## 397
## 406
## 495
## 514
## 516
## 534
## 536
## 540
## 572
## 612
## 657
## 674
## 679
## 686
## 696
## 722
## 748
## 821
## 900
## 924
## 967
## 991
## 993
## 997_Show_the_Sequence
### 題目簡述:book:
體感難度:★★
[Browse Problem](https://onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=938)
### 詳解:pencil2:(知識點:找規律)
### 參考程式碼
```cpp=
#include<bits/stdc++.h>
using namespace std;
int main(){
string str;
int N,x;
char ch;
while(cin>>str>>N){
stack<char> stk;
vector<char> op;
vector<int> v0,v1;
stringstream ss(str);
while(ss>>ch){
if(ch=='*'||ch=='+')
op.push_back(ch);
else if(isdigit(ch)||ch=='-'){
ss.unget();
ss>>x;
v0.push_back(x);
}
}
reverse(v0.begin(),v0.end());
reverse(op.begin(),op.end());
v1=vector<int>(v0.size(),0);
for(int j=1;j<v0.size();j++){
if(op[j-1]=='*')
v0[j]=v0[j-1]*v0[j];
}
cout<<*v0.rbegin();
for(int i=1;i<N;i++){
v1[0]=v0[0];
for(int j=1;j<v1.size();j++){
if(op[j-1]=='+')
v1[j]=v0[j-1]+v0[j];
else
v1[j]=v1[j-1]*v0[j];
}
cout<<' '<<*v1.rbegin();
v0.swap(v1);
}
cout<<'\n';
}
}
```
## 1200
## 1210
## 1262
## 1644
## 1730
## 1753
## 10001
## 10002
## 10004_Bicoloring
[Browse Problem](https://onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=945)
```cpp=
#include <bits/stdc++.h>
using namespace std;
int main(){
int n,m,a,b;
while(cin>>n,n){
cin>>m;
vector<int> g[210],vis(210);
while(m--){
cin>>a>>b;
g[a].push_back(b);
g[b].push_back(a);
}
try{
for(int i=0;i<n;i++){
stack<int> s;
if(vis[i]==0)
vis[i]=1,s.push(i);
while(s.size()){
int node=s.top();
s.pop();
for(int child:g[node]){
if(vis[child]==0){
s.push(child);
vis[child]=(vis[node]==1 ? 2:1);
}
else if(vis[child]==vis[node]){
throw 1;
}
}
}
}
cout<<"BICOLORABLE.\n";
}
catch(int e){
cout<<"NOT BICOLORABLE.\n";
}
}
}
```
## 10006
## 10009
## 10010
## 10013_Super_long_sums
體感難度:★
[Browse Problem](https://onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=938)
### 詳解:pencil2:(知識點:大數加法)
### 參考程式碼
[Browse Problem](https://onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&category=0&problem=954&mosmsg=Submission+received+with+ID+28272917)
```cpp=
#include<bits/stdc++.h>
using namespace std;
int main(){
int t;
char ch;
cin>>t;
while(t--){
string s1,s2,c,ans;
int a,b,n;
cin>>n;
while(n--){
cin>>a>>b;
s1.push_back(a);
s2.push_back(b);
}
reverse(s1.begin(),s1.end());
reverse(s2.begin(),s2.end());
ans=c=string(s1.size()+1,0);
for(int i=0;i<s1.size();i++){
c[i+1]=(s1[i]+s2[i]+c[i])/10;
ans[i]=(s1[i]+s2[i]+c[i])%10;
}
if(*c.rbegin()==char(1))
*ans.rbegin()=1;
else
ans.pop_back();
for(int i=ans.size()-1;i>=0;i--)
cout<<int(ans[i]);
cout<<'\n';
if(t!=0)
cout<<'\n';
}
}
```
### python速解
```python=
t=int(input())
for tt in range(t):
ch=input()
n=int(input())
ans=0
for i in range(n):
a,b=map(int,input().split())
ans+=(a+b)*10**(n-1-i)
print(ans,end="\n\n")
```
## 10014
## 10015
## 10016
## 10017
## 10020
## 10028
## 10034
## 10039
## 10040
## 10060
## 10061
## 10063
## 10064
## 10066
## 10070
## 10077
## 10098
## 10100
## 10102
## 10104
## 10106
## 10107
## 10110
## 10114
## 10115
## 10116
## 10125
## 10127
## 10137
## 10138
## 10140
## 10141
## 10142
## 10145
## 10146
## 10152
## 10160
## 10161
## 10167
## 10172
## 10174
## 10176
## 10180
## 10182
## 10192
## 10193
## 10194
## 10195
## 10196
## 10197
## 10200
## 10205
## 10220
## 10223
## 10225
## 10227
## 10233
## 10236
## 10238
## 10252
## 10256
## 10263
## 10264
## 10266
## 10267
## 10283
## 10284
## 10286
## 10287
## 10289
## 10293
## 10295
## 10297
## 10298
## 10299
## 10301
## 10302
## 10305
## 10311
## 10312
## 10315
## 10322
## 10325
## 10327
## 10333
## 10334
## 10336
## 10338
## 10339
## 10341
## 10343
## 10344
## 10345
## 10347
## 10348
## 10352
## 10360
## 10368
## 10371
## 10372
## 10382
## 10405
## 10406
## 10407
## 10408
## 10427
## 10432
## 10440
## 10450
## 10466
## 10489
## 10494
## 10497
## 10504
## 10508
## 10523
## 10527
## 10535
## 10555
## 10563
## 10579
## 10583
## 10596
## 10608
## 10611
## 10625
## 10666
## 10670
## 10673
## 10684
## 10700
## 10718
## 10730
## 10738
## 10763
## 10815
## 10820
## 10858
## 10871
## 10881
## 10887
## 10901
## 10902
## 10910
## 10915
## 10916
## 10920
## 10924
## 10926
## 10930
## 10936
## 10940
## 10959
## 11013
## 11039
## 11040
## 11043
## 11051
## 11056
## 11057
## 11067
## 11076
## 11078
## 11086
## 11093
## 11094
## 11096
## 11115
## 11121
## 11157
## 11235
## 11241
## 11264
## 11286
## 11287
## 11308
## 11326
## 11335
## 11340
## 11344
## 11348
## 11350
## 11360
## 11369
## 11396
## 11403
## 11412
## 11417_GCD
體感難度:★
[Browse Problem](https://onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&category=0&problem=2412&mosmsg=Submission+received+with+ID+28279037)
### 詳解:pencil2:(知識點:大數加法)
### 參考程式碼
```cpp=
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
while(cin>>n,n){
long long int ans=0;
for(int i=1;i<n;i++)
for(int j=i+1;j<=n;j++)
ans+=__gcd(i,j);
cout<<ans<<'\n';
}
}
```
## 11418
## 11462
## 11475
## 11480
## 11484
## 11505
## 11507
## 11508
## 11515
## 11518
## 11519
## 11520
## 11536
## 11538
## 11550
## 11583
## 11586
## 11609
## 11614
## 11615
## 11616
## 11629
## 11683
## 11692
## 11703
## 11714
## 11729
## 11730
## 11742
## 11847
## 11849
## 11850
## 11879
## 11898
## 11953
## 11957
## 11991
## 11995
## 11997
## 12160
## 12207
## 12382
## 12406_Help_Dexter
> [time=Mon, Jul 18, 2022 10:16 PM]
### 題目簡述:book:
體感難度:★★
[Browse Problem](https://onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=3837)
### 詳解:pencil2:(知識點:利用二進位窮舉)
### 參考程式碼
```cpp=
#include<bits/stdc++.h>
#define int long long
using namespace std;
signed main(){
int t,p,q;
int pow2[18]={1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768,65536,131072};
cin>>t;
for(int d=1;d<=t;d++){
cin>>p>>q;
set<int> s;
for(int i=0;i<pow2[p];i+=2){
int num=0,k=i,digits=1;
for(int r=1;digits<=p;r*=10,digits++){
num+=(k&1?1:2)*r;
k>>=1;
}
if(num%pow2[q]==0)s.insert(num);
}
cout<<"Case "<<d<<": ";
if(s.size()==0)cout<<"impossible"<<endl;
else if(s.size()==1)cout<<*s.begin()<<endl;
else cout<<*s.begin()<<' '<<*s.rbegin()<<endl;
}
}
```
---
## 12455_Bars
> [time=Mon, Jul 18, 2022 8:21 PM]
### 題目簡述:book:
體感難度:★
[Browse Problem](https://onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=3886)
### 詳解:pencil2:(知識點:利用二進位窮舉)
### 參考程式碼
```cpp=
#include<bits/stdc++.h>
using namespace std;
int main(){
int t,n,p;
cin>>t;
while(t--){
bool OK=0;
cin>>n>>p;
vector<int> v(p);
for(int i=0;i<p;i++)cin>>v[i];
for(int i=0;i<pow(2,p)&&!OK;i++){
int k=i,len=0;
for(int cur=0;k;cur++){
if(k%2)len+=v[cur];
k>>=1;
}
OK=(len==n);
}
cout<<(OK?"YES":"NO")<<endl;
}
}
```
---
## 12592_Slogan_Learning_of_Princess
> [time=Tue, Jul 19, 2022 7:14 PM]
### 題目簡述:book:
體感難度:0
[Browse Problem](https://onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4270)
### :pencil:(知識點 : map)
### 參考程式碼
```cpp=
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
string a,b;
map<string,string> m;
cin>>n>>ws;
while(n--){
getline(cin,a);
getline(cin,b);
m[a]=b;
}
cin>>n>>ws;
while(n--){
getline(cin,a);
cout<<m[a]<<endl;
}
}
```
---
## 12545_Bits_Equalizer
> [time=Mon, Jul 18, 2022 8:21 PM]
### 題目簡述:book:
體感難度:★★
[Browse Problem](https://onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=3990)
### 詳解:pencil2:(知識點:貪心)
### 參考程式碼
```cpp=
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
cin>>n;
for(int k=1;k<=n;k++){
string s,t;
int step=0,d=0,add=0; //d=sumT-sumS
cin>>s>>t;
for(int i=0;i<s.size();i++)d+=(t[i]=='1')-(s[i]=='1');
if(d<0){
cout<<"Case "<<k<<": -1"<<endl;
continue;
}
for(int i=0;i<s.size();i++){ //處理'?'
if(s[i]!='?')continue;
if(d>0 && t[i]=='1')s[i]='1',d--;
else s[i]='0';
step++;
}
for(int i=0;i<s.size()&&d>0;i++){ //補'1'
if(s[i]=='0'&&t[i]=='1'){
s[i]='1';
d--,step++;
}
}
for(int i=0;i<s.size();i++) // XOR
add+=!(s[i]==t[i]);
step+=(add/2);
cout<<"Case "<<k<<": "<<step<<endl;
}
}
```
---
## 12694_Meeting_Room_Arrangement
> [time=Mon, Jul 18, 2022 7:14 PM]
### 題目簡述:book:
體感難度:★
[Browse Problem](https://onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4432)
### 詳解:pencil2:(知識點:工作排程貪心)
### 參考程式碼
```cpp=
#include<bits/stdc++.h>
using namespace std;
int main(){
int t,a,b;
cin>>t;
while(t--){
vector<pair<int,int>> v; //pair<end,start>
while(cin>>a>>b,a||b)v.push_back({b,a});
sort(v.begin(),v.end());
int back=v[0].first,ans=1;
for(int i=1;i<v.size();i++){
if(v[i].second>=back){
back=v[i].first;
ans++;
}
}
cout<<ans<<endl;
}
}
```
---
## 12705_Breaking_Board
> [time=Mon, Jul 18, 2022 6:45 PM]
### 題目簡述:book:
體感難度:★
[Browse Problem](https://onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4443)
### 詳解:pencil2:(知識點:map+權重排序)
### 參考程式碼
```cpp=
#include<bits/stdc++.h>
using namespace std;
int main(){
int t;
cin>>t>>ws;
while(t--){
int sum=0;
string s;
getline(cin,s);
int cost[36]={2,3,3,4,4,4,5,5,5,5,6,6,6,6,6,7,7,7,7,7,7,8,8,8,8,8,9,9,9,9,10,10,10,11,11,12};
map<char,int> num,index;
priority_queue<pair<int,char>> pq;
for(char &e:s)if(e!=' ')num[e]++;
for(auto &it:num) pq.push({it.second,it.first});
for(int i=0;pq.size();i++){
index[pq.top().second]=i;
pq.pop();
}
for(char &e:s)if(e!=' ')sum+=cost[index[e]];
cout<<sum<<endl;
}
}
```
---
## 12797_Letters
> [time=Mon, Jul 18, 2022 12:01 PM]
### 題目簡述:book:
體感難度:★★★
[Browse Problem](https://onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=823&page=show_problem&problem=4662)
- 多筆測資EOF板。
- 在n*n的字元陣列中,找(0,0)->(n-1,n-1)之最短路徑,其中路徑上不可同時存在同字母之大小寫。
### 詳解:pencil2: (知識點:二進位+BFS)
#### 步驟一 找字母大小寫分布
窮舉路徑上字母大小寫分布可能(0:只允許小寫 1:只允許大寫)
| index | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
| ------ | ----- | ----- | ----- | ----- | ----- | ----- | ----- | ----- | ----- | ----- |
| **letter** | **A** | **B** | **C** | **D** | **E** | **F** | **G** | **H** | **J** | **I** |
| i=0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| i=1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| i=2 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| i=3 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
```cpp=
//利用二進位性質可窮舉vector<bool> t(10)之所有排列
for(int i=0;i<1024;i++){
vector<bool> t(10);
for(int cur=0,k=i;k;k>>=1)t[cur++]=k&1;
}
```
#### 步驟二 找最短路徑
對每一種大小寫分布可能分別進行BFS找出最短路徑。
### 參考程式碼
```cpp=
#include<bits/stdc++.h>
#define oo 10010
using namespace std;
typedef tuple<int,int,int> tiii;
int dr[4]{-1,0,0,1},dc[4]{0,-1,1,0},ans;
int isup(char &ch){
return (ch<97);
}
int toi(char &ch){
return isup(ch)?ch-65:ch-97;
}
void bfs(vector<string> v,vector<bool> &t,int n){
queue<tiii> q;
int flag=1,r,c,step;
if(isup(v[0][0])==t[toi(v[0][0])])q.push(tiii{0,0,1});
while(q.size()&&flag){
tie(r,c,step)=q.front();
q.pop();
for(int k=0;k<4&&flag;k++){
int r1=r+dr[k],c1=c+dc[k];
if(r1>=0 && r1<n && c1>=0 && c1<n && v[r1][c1]!=0 && isup(v[r1][c1])==t[toi(v[r1][c1])]){
if(r1==n-1 && c1==n-1){
ans=min(ans,step+1);
flag=0;
}
v[r1][c1]=0;
q.push(tiii{r1,c1,step+1});
}
}
}
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
int n;
while(cin>>n){
ans=oo;
vector<string> v(n,"");
for(int i=0;i<n;i++)cin>>v[i];
for(int i=0;i<1024;i++){
vector<bool> t(10);
for(int cur=0,k=i;k;k>>=1)t[cur++]=k&1;
bfs(v,t,n);
}
cout<<(ans!=oo?ans:-1)<<endl;
}
}
```
---
## 12844
---
## 13185_DPA_Numbers_I
> [time=Mon, Jul 18, 2022 3:45 PM]
### 題目簡述:book:
體感難度:★
[Browse Problem](https://onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=5096)
- T筆測資。
- 輸入正整數n,設x為n的所有因數總和減去n:
x=n 輸出 "perfect"
x<n 輸出 "deficient"
x>n 輸出 "abundant"
### 詳解:pencil2: (知識點:國小因數分解)
1~sqrt(n)找因數並相加,注意!當i=sqrt(n)時只加一次。
### 參考答案
```cpp=
#include<bits/stdc++.h>
using namespace std;
int main(){
int t,n;
cin>>t;
while(t--){
cin>>n;
int sum=0;
for(int i=1;i*i<=n;i++)
if(n%i==0)sum+=(i*i==n)?i:(i+n/i);
if(sum-n==n)cout<<"perfect"<<endl;
else if(sum-n<n)cout<<"deficient"<<endl;
else cout<<"abundant"<<endl;
}
}
```
---
## 13194_DPA_Numbers_II
> [time=Mon, Jul 18, 2022 4:45 PM]
### 題目簡述:book:
體感難度:★★★★
[Browse Problem](https://onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=5096)
- [承上題](#13185_DPA_Numbers_I)
- 只是n很大很大 (2<=n<=10^12)
### 詳解:pencil2: (知識點:找質數+DFS)
#### 步驟一 找不大於sqrt(10^12)之所有質數
- **埃拉托斯特尼篩法**:
建立數字表並全部設為true
重複以下操作:
1. 找到還沒被設為false的最小數字
2. 將該數字放入質數陣列
3. 將表中所有該數的倍數設為false
![](https://i.imgur.com/AUoGCdm.png)
```cpp=
vector<bool> prime_table(N,1);
vector<int> prime;
void build(){
prime_table[0]=prime_table[1]=0;
for(int i=2;i<N;i++){
if(prime_table[i]){
prime.push_back(i);
for(int j=i+i;j<N;j+=i)
prime_table[j]=0;
}
}
}
```
#### 步驟二 找質因數
利用質數陣列對n質因數分解
```cpp=
vector<pair<int,int>> vec; //pair<質因數,數量>
for(int i=0;n1>1&&i<prime.size();i++){
if(n1%prime[i]==0)vec.push_back({prime[i],0});
while(n1%prime[i]==0){
n1/=prime[i];
vec[vec.size()-1].second++;
}
}
if(n1>1) //n1>1代表n還存在一個大於sqrt(10^12)的質因數
vec.push_back({n1,1});
```
#### 步驟三 找因數
用DFS窮舉所有因數 (解答中用回朔法優化)
![](https://i.imgur.com/Rx9lo5u.png)
### 參考答案
```cpp=
#include<bits/stdc++.h>
#define N 1000010
#define int long long
using namespace std;
vector<bool> prime_table(N,1);
vector<int> prime;
void build(){
prime_table[0]=prime_table[1]=0;
for(int i=2;i<N;i++){
if(prime_table[i]){
prime.push_back(i);
for(int j=i+i;j<N;j+=i)
prime_table[j]=0;
}
}
}
int dfs(vector<pair<int,int>>& v,int idx){
if(idx==v.size()){
int sum=1;
for(int i=0;i<v.size();i++)sum*=pow(v[i].first,v[i].second);
return sum;
}
int siz=v[idx].second,ans=0;
for(int i=0;i<=siz;i++){
v[idx].second=i;
ans+=dfs(v,idx+1);
}
return ans;
}
signed main(){
build();
int t,n,n1,sum;
cin>>t;
while(t--){
cin>>n;
n1=n;
vector<pair<int,int>> vec;
for(int i=0;n1>1&&i<prime.size();i++){
if(n1%prime[i]==0)vec.push_back({prime[i],0});
while(n1%prime[i]==0){
n1/=prime[i];
vec[vec.size()-1].second++;
}
}
if(n1>1)vec.push_back({n1,1});
sum=dfs(vec,0);
if(sum-n==n)cout<<"perfect"<<endl;
else if(sum-n<n)cout<<"deficient"<<endl;
else cout<<"abundant"<<endl;
}
}
```
---