1. 程式人生 > >牛牛和羊羊猜數字遊戲 java

牛牛和羊羊猜數字遊戲 java



/**
 *
 * 牛牛和羊羊在玩一個有趣的猜數遊戲。在這個遊戲中,牛牛玩家選擇一個正整數,羊羊根據已給的提

示猜這個數字。第i個提示是"Y"或者"N",表示牛牛選擇的數是否是i的倍數。
例如,如果提示是"YYNYY",它表示這個數使1,2,4,5的倍數,但不是3的倍數。
注意到一些提示會出現錯誤。例如: 提示"NYYY"是錯誤的,因為所有的整數都是1的倍數,所以起始元素

肯定不會是"N"。此外,例如"YNNY"的提示也是錯誤的,因為結果不可能是4的倍數但不是2的倍數。
現在給出一個整數n,表示已給的提示的長度。請計算出長度為n的合法的提示的個數。
例如 n = 5:
合法的提示有:
YNNNN YNNNY YNYNN YNYNY YYNNN YYNNY
YYNYN YYNYY YYYNN YYYNY YYYYN YYYYY
所以輸出12
輸入描述:

輸入包括一個整數n(1 ≤ n ≤ 10^6),表示已給提示的長度。


輸出描述:

輸出一個整數,表示合法的提示個數。因為答案可能會很大,所以輸出對於1000000007的模
示例1
輸入

5
輸出

12
 */
/**
 *

思路:1.第i個數是素數,那麼dp[i]=dp[i-1]*2,這是因為素數和前面的所有數都沒有依賴關係,因此

YN都行
 2.第i個數不是素數,且不是素數的冪次,也就是像6這樣的數字,你會發現,它已經被2,3唯

一確定了,例如23分別是YY,那麼6一定是Y,23分別是YN或NY或NN,6一定是N,所以說這時候有dp

[i]=dp[i-1]    
 3.第i個數不是素數,且是素數的冪次,它不能唯一確定,比如4,當2為Y時,4不確定,可以

是Y,也可以是N。將4和2放入集合,若2取,4必定取,所以有NN,YN,YY三種情況。
那麼引申一下,加入8就是3個元素的集合,共4種情況,9就是2個元素的集合(3、9),有3種情況,以

此類推。最後將這些情況相乘即可,因為這些集合之間相互不影響
 */
package test;

import java.util.Scanner;

public class Main {
 public static void main(String[] args) {
  Scanner sc = new Scanner(System.in);
  while (sc.hasNext()) {
   int n = sc.nextInt();
   System.out.println(solve(n));
  }
 }

 private static long solve(int n) {
  boolean[] include = new boolean[n + 1];
  //用 int 會溢位
  long p = 1;
  for (int i = 2; i <= n; i++) {
   if (!include[i]) {
    int count = 1;
    //求素數與素數的乘積,下面的迴圈可以得到所有i以內的值
    for (int j = i; j <= n; j += i) {
     include[j] = true;
    }
    //求素數的冪,用 int 會溢位,一個有兩種情況,兩個有三種情

況,三個有四種情況,以此類推
    for (long j = i; j <= n; j *= i) {
     count++;
    }
    p = (p * count) % 1000000007;
   }
  }
  return p;
 }
}