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 }