题意:
给一个数N,两人轮流操作
每次将N变为一个N的非1非自身的因数,第一个无法进行操作的人获胜
问先手是否有必胜策略,如果有的话在第二行输出第一步换成哪个数,如果第一步就不能操作则输出0
数据规模:N≤10^13。
思路:
当N为1或者质数时,先手胜且输出0
当N恰为两个质数的乘积时,先手负,因为他必须写下一个质数,使后手获胜
其他情况下,他只要写下N的任意两个质因数的乘积就能获胜。
#include <iostream>
#include <cstring>
#include <vector>
#include <cstdio>
using namespace std; int main()
{
long long i;
long long q;
vector<long long>v;
while(cin>>q)
{
v.clear();
for(i = ; i*i <= q; i++)
while(q%i==)
{
v.push_back(i);
q /= i;
}
if(q>)
v.push_back(q); if(v.size()<)
printf("1\n0\n");
else if(v.size()==)
printf("2\n");
else
printf("1\n%d\n", v[]*v[]);
}
return ;
}
求一个数的质因数的模板:
可能有重复的, 如输入8 会输出:2 2 2;
也有可能只有自身,如输入11 输出11
但是v数组里的数的乘积就等于 输入的数字。
#include <iostream>
#include <cstring>
#include <vector>
#include <cstdio>
using namespace std; int main()
{
long long i;
long long q;
vector<long long>v;
while(cin>>q)
{
v.clear();
for(i = ; i*i <= q; i++)
while(q%i==)
{
v.push_back(i);
q /= i;
}
if(q>)
v.push_back(q); for(i = ; i < v.size(); i++)
{
cout<<v[i]<<" ";
}
cout<<endl;
}
return ;
}