cf 151 C. Win or Freeze (博弈 求大数质因子)

题目

题意:

给一个数N,两人轮流操作
每次将N变为一个N的非1非自身的因数,第一个无法进行操作的人获胜
问先手是否有必胜策略,如果有的话在第二行输出第一步换成哪个数,如果第一步就不能操作则输出0
数据规模:N≤10^13。

思路:

当N为1或者质数时,先手胜且输出0
当N恰为两个质数的乘积时,先手负,因为他必须写下一个质数,使后手获胜
其他情况下,他只要写下N的任意两个质因数的乘积就能获胜。

 1 #include <iostream>
 2 #include <cstring>
 3 #include <vector>
 4 #include <cstdio>
 5 using namespace std;
 6 
 7 int main()
 8 {
 9     long long i;
10     long long q;
11     vector<long long>v;
12     while(cin>>q)
13     {
14        v.clear();
15        for(i = 2; i*i <= q; i++)
16           while(q%i==0)
17             {
18                 v.push_back(i);
19                 q /= i;
20             }
21         if(q>1)
22             v.push_back(q);
23 
24         if(v.size()<2)
25         printf("1
0
");
26         else if(v.size()==2)
27             printf("2
");
28         else
29             printf("1
%d
", v[0]*v[1]);
30     }
31     return 0;
32 }

求一个数的质因数的模板:

可能有重复的, 如输入8  会输出:2 2 2;

也有可能只有自身,如输入11 输出11

但是v数组里的数的乘积就等于 输入的数字。

 1 #include <iostream>
 2 #include <cstring>
 3 #include <vector>
 4 #include <cstdio>
 5 using namespace std;
 6 
 7 int main()
 8 {
 9     long long i;
10     long long q;
11     vector<long long>v;
12     while(cin>>q)
13     {
14        v.clear();
15        for(i = 2; i*i <= q; i++)
16           while(q%i==0)
17             {
18                 v.push_back(i);
19                 q /= i;
20             }
21         if(q>1)
22             v.push_back(q);
23 
24         for(i = 0; i < v.size(); i++)
25         {
26            cout<<v[i]<<" ";
27         }
28         cout<<endl;
29     }
30     return 0;
31 }
原文地址:https://www.cnblogs.com/bfshm/p/3685177.html