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\n0\n");
26         else if(v.size()==2)
27             printf("2\n");
28         else
29             printf("1\n%d\n", 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 }

 

posted @ 2014-04-24 12:23  水门  阅读(351)  评论(0编辑  收藏  举报