[codeforces 1370C] Number Game 質因數分解+坑點賊多

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;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章