CodeForces 150A Win or Freeze(博弈+质因数分解模板,好题)

题意:现在你有一个原始数n ,小公举和corn 两个人轮流取一个数a.a为n的因子(a不与1或n相等),然后令a为新的原始数n。当某名玩家不能从n中取数时,该名玩家获胜。当小公举获胜时输出1 ,为了防止小公举瞎猜的莽夫体质,还要输出小公举第一次取得数是什么。假如corn获胜直接输出2即可。

题解:显然我们只要在找到n的两个质因数a,b然后取最小的两个质因数a,b得到a*b就一定能赢。思路不难想,重点是实现的时候,我刚开始用素数筛去寻找质因数再第九个样例RE了,后来参考大佬的代码才知道数论里面有求解质因数的模板,啧啧啧,自己还是会的太少了,继续加油吧。

AC代码:

#include <iostream>
#include <cstdio>
#include <string>
#include <vector>
#include <cstring>
#include <algorithm>
#define int long long
#define IOS ios::sync_with_stdio(false);cin.tie(0);
using namespace std;
typedef long long ll;
const int maxn=1e6+5;
main() {
	int n;
	vector<int>ans;
	cin>>n;
	int x=n;
	for(int i=2; i*i<=n; i++) {//求解n的质因数
		while(n%i==0) {
			ans.push_back(i);
			n/=i;
		}
	}
	if(x!=n&&n!=1)ans.push_back(n);
	if(ans.size()>2)cout<<1<<endl<<ans[0]*ans[1]<<endl;
	else if(ans.size()==2)cout<<2<<endl;
	else cout<<1<<endl<<0<<endl;
}


猜你喜欢

转载自blog.csdn.net/Alanrookie/article/details/107564227