#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int i,j,k,n,m,t;
double res;
int main() {
cin>>n;
for(i=1;i<=n;i++){
res+=1.0/i/pow(2,i);
}
printf("%.6lf",res);
}
#include <bits/stdc++.h>
using namespace std;
int dfs(int a,int b){
if(a<b){
int t=a;
a=b;
b=t;
}
int t=a%b;
if(t==0) return 1;
int ans=dfs(b,t);
if(ans==0) return 1;
if(t+b<a) ans=dfs(t+b,b);
if(ans==0) return 1;
return 0;
}
int main() {
int a,b;
cin>>a>>b;
if(dfs(a,b)==1) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
return 0;
}
4. MT2289 誰會赢呢?
(1)題目描述
小碼哥和小碼弟正在玩遊戲,他們都絕頂聰明。
開始時有一個整數n,二者輪流行動,每次行動可以在目前的n上減去其一個非1非n的因子。
若某一方無法進行操作則判其輸,小碼哥先手,誰會赢呢?
格式
輸入格式:
第一行一個正整數t表示資料組數。接下來t行,每行一個整數表示n
.
輸出格式: t行,每行輸出獲勝者
樣例1:
輸入:
4
1
4
12
69
.
輸出:
xiaomadi
xiaomage
xiaomage
xiaomadi
(2)參考代碼
import time
from typing import List, Tuple
from collections import deque, Counter
from queue import PriorityQueue
import math
from functools import lru_cache
#from sortedcontainers import SortedDict, SortedSet
import random
import copy
import sys
sys.setrecursionlimit(999999999)
MOD = 10**9 + 7
def get_prime(N):
prime_vals = []
flag = [True] * (N+1)
for val in range(2, N+1):
if flag[val]:
prime_vals.append(val)
for p_val in prime_vals:
if val * p_val > N:
break
flag[val * p_val] = False
if val % p_val == 0:
break
return prime_vals
primes = get_prime(100000)
def devide_prime(val):
ans = []
for i in primes:
if i*i > val:
break
if val % i == 0:
cnt = 0
while val % i == 0:
val //= i
cnt += 1
ans.append((i, cnt))
if val == 1:
break
if val != 1:
ans.append((val, 1))
return ans
# 統計不等于1或者x自身的因子
def get_div(x):
ret = devide_prime(x)
ans = []
def dfs(ii, val):
nonlocal ans
if ii == len(ret):
if 1 < val < x:
ans.append(val)
return
for i in range(ret[ii][1] + 1):
dfs(ii + 1, val * (ret[ii][0] ** i))
dfs(0, 1); return ans
def is_prime(x):
if x <= 1:
return False
if x <= 3:
return True
i = 2
while True:
if i * i > x:
break
if i * i == x:
return False
if x % i == 0:
return False
i += 1
return True
# 擷取2的次幂數
def get_2_cnt(x):
cnt = 0
while x > 0 and x & 1 == 0:
cnt += 1
x >>= 1
return cnt
def main():
# 先手是否必赢
def dp(x):
if x == 1 or is_prime(x):
return False
div = get_div(x)
for v in div:
if not dp(x - v):
return True
return False
T = int(input())
for _ in range(T):
n = int(input())
if n <= 10:
ret = dp(n)
else:
# 規律:n是偶數且不是2的奇數次幂,則先手必勝
cnt2 = get_2_cnt(n)
ret = False
if n % 2 == 0:
if not (cnt2 & 1 == 1 and n == (1 << cnt2)):
ret = True
print("Honcy" if ret else "Tak")
if __name__ == '__main__':
main();
#include<bits/stdc++.h>
/*
思路:不越獄的狀态好計算是以:越獄數=總的狀态數-不越獄的狀态數
其中 總的狀态數為:m^n
不越獄的狀态數: m*(m-1)^(n-1) :隻有第一個可以選擇m個宗教,其他的隻能選和前一個不同的宗教是以是m-1種情況
這裡計算用了快速幂的方法。
*/
using namespace std;
long long p=1007;
long long qpow(long long x, long long y){
if(y==0)
return 1;
if(y%2==1){
return qpow(x, y - 1) * x % p;
}else{
long long t = qpow(x, y/2) % p;
return t*t % p;
}
}
int main( )
{
long long m,n;
cin>>m>>n;
long long ans = qpow(m,n)-(m*qpow(m-1,n-1)%p);
cout<<(ans+p)%p<<endl;//注意需要+p之後再取 %p,防止有負數
return 0;
}