ACdream 1112 Alice and Bob (博弈&&素數篩選優化)
題目連結:傳送門
遊戲規則:
沒次可以將一堆分成兩堆 x = a*b (a!=1&&b!=1)x為原來堆的個數,a,b為新堆的個數。
也可以將原來的堆的個數變成原來堆的約數y,y!=x。進行最後一次操作的人獲勝。
分析:
也是一個去石頭的遊戲,因此我們只需要將所有情況的sg值異或起來就好了。
我們首先來考慮一堆。設這一堆的個數為x;
那麼所有的情況就是
(a1,x/a1), (a2,x/a2),...,(an,x/an);或者(a1),(a2),..,(an)。
由於資料量比較大,我們樸素的找約數肯定會超時。然後仔細分析一下這個問題。因為我
們都是圍繞著約數來進行操作,那麼也就相當於在對他的素因子的個數進行操作。
x=a1^r1*a2^r2*...*an^rn;設sum = r1+r2+...+rn.
然後所有的情況就可以表示為:
(1,sum-1),(2,sum-2),...(sum/2,sum-sum/2)或者(1),(2),...(n-1)
這樣就大大減小了資料的範圍。然後在計算sum的時候我們可以這樣計算。
設一個數為x,他的最小的素因子為y.則sum[x] = sum[x/y] + 1;
程式碼如下:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn = 5000010;
int prime[maxn],cnt;
bool isprime[maxn];
int fac_num[maxn];
int min_fac[maxn];
int sg[100];
void GetPirme(){
cnt=0;
memset(isprime,0,sizeof(isprime));
memset(fac_num,-1,sizeof(fac_num));
memset(min_fac,-1,sizeof(min_fac));
for(int i=2;i<maxn;i++){
if(!isprime[i]){
prime[cnt++]=i;
for(int j=i+i;j<maxn;j+=i){
isprime[j]=1;
if(min_fac[j]==-1)
min_fac[j]=i;
}
min_fac[i]=i;
}
}
}
int get_num(int x){
if(x==1) return 0;
if(fac_num[x]!=-1) return fac_num[x];
return fac_num[x]=get_num(x/min_fac[x])+1;
}
int Get_Sg(int x){
if(sg[x]!=-1) return sg[x];
bool vis[100];
memset(vis,0,sizeof(vis));
for(int i=1;i<=x;i++) vis[Get_Sg(x-i)]=1;
for(int i=1;i<=x/2;i++)
vis[Get_Sg(i)^Get_Sg(x-i)]=1;
for(int i=0;;i++){
if(!vis[i]){
return sg[x]=i;
}
}
}
void init(){
GetPirme();
memset(sg,-1,sizeof(sg));
sg[0]=0;
}
int main()
{
init();
int n;
while(~scanf("%d",&n)){
int x ,ans=0;
for(int i=0;i<n;i++){
scanf("%d",&x);
//cout<<"num: "<<get_num(x)<<endl;
ans^=Get_Sg(get_num(x));
}
if(ans) puts("Alice");
else puts("Bob");
}
return 0;
}
相關文章
- Find Terrorists(素數篩選+素因子分解)Error
- Codeforces 346A Alice and Bob
- 素數個數 <埃式篩 && 尤拉篩>
- 【數論】素數篩法
- [演算法]: 素數篩法演算法
- 面試官本拿求素數搞我,但被我優雅的“回擊“了(素數篩)面試
- 面試官本拿求素數搞我,但被我用素數篩優雅的“回擊“了面試
- 尤拉素數篩選與命令列傳參啟動C程式命令列C程式
- 數論線性篩總結 (素數篩,尤拉函式篩,莫比烏斯函式篩,前n個數的約數個數篩)函式
- Diff-prime Pairs(思維+素數篩)AI
- Codeforces Beta Round #6 (Div. 2 Only) C. Alice, Bob and Chocolate 水題
- 篩選法求質數
- 洛谷P3383 【模板】線性篩素數
- SQL Server 2008 引數化行篩選器SQLServer
- 遊戲目標的篩選、建立、強化遊戲
- POJ 2262 Goldbach's Conjecture (求解素數的一般篩和線性篩)Go
- 通過點陣圖篩選優化資料倉儲查詢效能優化
- 增補部落格 第二十篇 python 篩法求素數Python
- 效能優化之關於畫素管道及優化(二)優化
- 易優CMS模板標籤screening文件篩選指定自定義欄位讀取篩選條件
- Android開商品屬性篩選與商品篩選Android
- jQuery 篩選方法jQuery
- 動態篩選
- 尤拉篩線性篩質數
- 山東省第四屆ACM大學生程式設計競賽-Alice and Bob(二進位制&&找規律)ACM程式設計
- 質數篩
- JQuery選擇器——可見性篩選選擇器和屬性篩選選擇器jQuery
- 博弈論題目選做
- wpf ObservableCollection篩選功能
- HDU 4542 小明系列故事——未知剩餘系 (DFS 反素數 篩子預處理)
- 篩選數十億化合物庫,華盛頓大學藥物AI虛擬篩選平臺,登Nature子刊AI
- excel批量篩選重複人名 excel怎麼篩選相同的名字Excel
- excel批次篩選重複人名 excel怎麼篩選相同的名字Excel
- excel怎麼篩選?教你一個簡單粗暴的篩選技巧Excel
- SQL 優化 概念篇 之 選擇性和基數SQL優化
- js從字串中篩選出數字程式碼例項JS字串
- Pandas根據篩選條件對指定excel列進行篩選!神器!Excel
- Bob大叔:程式設計“老師傅”和他的職業素養(圖靈訪談)程式設計圖靈