1789: Problem E: A multiplication game
Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 68 Solved: 41
[Submit][Status][Web Board]Description
Problem E: A multiplication game
Stan and Ollie play the game of multiplication by multiplying an integer p by one of the numbers 2 to 9. Stan always starts with p = 1, does his multiplication, then Ollie multiplies the number, then Stan and so on. Before a game starts, they draw an integer 1 < n < 4294967295 and the winner is who first reaches p >= n. Each line of input contains one integer number n. For each line of input output one line either
Stan wins.or
Ollie wins.assuming that both of them play perfectly.
Input
Output
Sample Input
162 17 34012226
Sample Output
Stan wins. Ollie wins. Stan wins.
最近全是博弈~
这里是博弈+规律;
题目大意:给一个正整数n(1 < n < 4294967295),p=1,S和O游戏,S先手,两人轮流对p乘以2-9之间的一个数,首先使p>=n的人获胜。
不知道干什么,就列表找规律吧~
2-9 (0+2)——9 S win
10-18 (9+1)——9*2 O win
19-162 (2*9+1)——9*2*9 S win
163-324 (9*2*9+1)——9*2*9*2 O win
324-2916 (9*2*9*2+1)——9*2*9*2*9 S win
S和O赢的区间交替。
#include<bits/stdc++.h>
#define ll long long
#define ve vector
#define mp map
#define NO cout<<"NO"<<endl;
#define YES cout<<"YES"<<endl;
#define pre(i,a,b) for(int i=a;i<=b;i++)
#define rep(i,b,a) for(int i=b;i>a;i--)
#define mem(a,b) memset(a,b,sizeof(a))
#define st string
#define N 10005
using namespace std;
const int maxn=1e6+5;
const ll mod =1e15;
const int dx[]={-1,0,1,0};
const int dy[]={0,1,0,-1};
//set<ll> s;
ve<ll> v;
priority_queue<ll, ve<ll>, greater<ll> >q;
int lcm(int a,int b){
return a*b/__gcd(a,b);
}
bool isleaf(int x){
return x%400==0||(x%4==0&&x%100==0);
}
int primes[N], cnt;
bool vis[N];
void is_prime(int x){
vis[1] = vis[0] = 1;
for(int i = 2; i <= x; ++ i){
if(!vis[i])primes[cnt ++ ] = i;
for(int j = 0; primes[j] * i <= x; ++ j){
vis[primes[j] * i] = true;
if(i % primes[j] == 0)break;
}
}
}//1e6;
ll qpow(ll a,ll n)//快速幂 ll mod=1e15;
{
ll re=1;
while(n)
{
if(n&1)
re=(re*a)%mod;
n>>=1;
a=(a*a)%mod;
}
return re;
}
inline ll qmul(ll x,ll y,ll p)//快速乘
{
ll z=(long double)x/p*y;
ll res=(unsigned long long)x*y-(unsigned long long)z*p;
return (res+p)%p;
}
void pprint(char *);
struct ob
{
char MC[100];
double DJ;
int SL;
};
int main()
{
ll n;
while(cin>>n){
while(n>18){
n/=18;
}
if(n<=9)cout<<"Stan wins."<<endl;
else cout<<"Ollie wins."<<endl;
}
return 0;
}