Codeforces Round #651 (Div. 2) 參與排名人數14559
[codeforces 1370C] Number Game 質因數分解+坑點賊多
總目錄詳見https://blog.csdn.net/mrcrack/article/details/103564004
在線測評地址https://codeforces.com/contest/1370/problem/C
Problem | Lang | Verdict | Time | Memory |
---|---|---|---|---|
C - Number Game | GNU C++17 | Accepted | 46 ms | 200 KB |
收穫:學習了一個詞組rather than而不是
題目大意:給定一個數n,當前操作者,可以在一下兩個操作中任選一個:
1.若n能整除奇數,並且能保證整除奇數後的結果大於1,可以考慮讓n整除奇數,整除後的結果更新n,參與接下的操作。
2.若n-1的結果大於1,可以考慮讓n-1的結果更新n,參與接下的操作。
若當前操作者,什麼操作也做不了,那麼當前操作者認輸。
輸出該次比賽的獲勝者。
基本思路:涉及質因數分解,坑點還賊多,WA兩發後才AC.
樣例模擬如下
Ashishgup(簡寫爲A),FastestFinger(簡寫爲F)
1
FastestFinger
n=1,輪到A什麼都做不了,F贏
2
Ashishgup
n=2,輪到A,n=2-1=1
n=1,輪到F什麼都做不了,A贏
3
Ashishgup
n=3,輪到A,n=3/3=1
n=1,輪到F什麼都做不了,A贏
4
FastestFinger
n=4,輪到A,n=4-1=3
n=3,輪到F,n=3/3=1
n=1,輪到A什麼都做不了,F贏
5
Ashishgup
n=5,輪到A,n=5/5=1
n=1,輪到F什麼都做不了,A贏
6
FastestFinger
n=2*3,輪到A,n=2*3/3=2
n=2,輪到F,n=2-1=1
n=1,輪到A什麼都做不了,F贏
12
Ashishgup
n=2*2*3,輪到A,n=2*2*3/3=2*2
n=2*2,輪到F,n=2*2/2=2
n=2,輪到A,n=2-2=1
n=1,輪到F什麼都做不了,A贏
只靠樣例這點數據,該題是難以AC的,繼續舉例如下
1.下面是因式分解,只有偶數因子的情況
Ashishgup(簡寫爲A),FastestFinger(簡寫爲F)
8
FastestFinger
n=8=2*2*2,輪到A,n=8-1=7
n=7,輪到F,n=8/7=1
n=1,輪到A什麼都做不了,F贏
上面是因式分解,沒有奇數因子的情況
2.有偶數因子(偶數因子的個數大於等於2),同時也有奇數因子
Ashishgup(簡寫爲A),FastestFinger(簡寫爲F)
12
Ashishgup
n=12=2*2*3,輪到A,n=2*2*3/3=2*2
n=2*2,輪到F,n=4-1=3
n=3,輪到A,n=3/3=1
n=1,輪到F什麼都做不了,A贏
120
Ashishgup
n=120=2*2*2*3*5,輪到A,n=2*2*2*3*5/(3*5)=2*2*2,注意,將奇數因子一次耗盡
n=2*2*2,輪到F,n=8-1=7
n=7,輪到A,n=7/7=1
n=1,輪到F什麼都做不了,A贏
3.有偶數因子(偶數因子的個數等於1),同時也有奇數因子
Ashishgup(簡寫爲A),FastestFinger(簡寫爲F)
只有一個奇數因子
6
FastestFinger
n=6=2*3,輪到A,n=2*3/3=2
n=2,輪到F,n=2-1=1
n=1,輪到A什麼都做不了,F贏
奇數因子個數大於等於2
30
Ashishgup
n=30=2*3*5,輪到A,n=2*3*5/5=2*3
n=2*3,輪到F,n=2*3/3=2
n=2,輪到A,n=2-1=1
n=1,輪到F什麼都做不了,A贏
奇數因子個數大於等於2
90
Ashishgup
n=90=2*3*3*5,輪到A,n=2*3*3*5/(3*5)=2*3
n=2*3,輪到F,n=2*3/3=2
n=2,輪到A,n=2-1=1
n=1,輪到F什麼都做不了,A贏
AC代碼如下
#include <stdio.h>
void solve(){
int n,i,cnt0=0,cnt1=0;
scanf("%d",&n);
if(n==1)printf("FastestFinger\n");//特判
else if(n==2)printf("Ashishgup\n");//特判
else if(n%2)printf("Ashishgup\n");//n是奇數
else{//n是偶數
for(i=2;i*i<=n;i++)//質因數分解
if(n%i==0){
while(n%i==0){
n/=i;
if(i==2)cnt0++;//統計偶數因子個數
else cnt1++;//統計奇數因子個數
}
}
if(n>1)cnt1++;
if(cnt1==0)printf("FastestFinger\n");//只有偶數因子
else if(cnt0>=2)printf("Ashishgup\n");//有偶數因子(偶數因子的個數大於等於2),同時也有奇數因子
else if(cnt0==1){//有偶數因子(偶數因子的個數等於1),同時也有奇數因子
if(cnt1==1)printf("FastestFinger\n");//奇數因子個數是1
else printf("Ashishgup\n");//奇數因子個數大於等於2
}
}
}
int main(){
int t;
scanf("%d",&t);
while(t--)solve();
return 0;
}