publicclassMain{publicstaticvoidmain(String[] args){for(int i =2019; i <500000; i +=2019){String str = i +"";for(int j =0; j < str.length(); j++){if(Integer.parseInt(str.charAt(j)+"")%2==0){break;}if(j==str.length()-1){System.out.println(i);break;}}}}
import java.io.*;import java.util.Arrays;/**** 種子搜索算法**/publicclassMain{publicstaticvoidmain(String[] args)throws Exception {//記錄總數int sum =0;//獲取文件中所有字符并儲存在二維數組中char[][] c =newchar[30][50];int index =0;//IO流讀取文件BufferedReader buf =newBufferedReader(newFileReader(newFile("src/tt.text")));String s;while((s = buf.readLine())!= null){c[index++]= s.toCharArray();}//定義了每個字符的各個方向int[][] arr ={{-1,1},{1,0},{1,1},{0,1},{1,-1}};for(int i =0; i <30; i++){for(int j =0; j <50; j++){for(int k =0; k <5; k++){int x = i, y = j;while(true){x += arr[k][0];y += arr[k][1];if(x <0|| y <0|| x >=30|| y >=50){break;}if(c[x][y]> c[i][j]){sum++;}}}}}System.out.println(sum);}}
【問題描述】 學習了約數后,小明對于約數很好奇,他發現,給定一個正整數 t,總是可 以找到含有 t 個約數的整數。小明對于含有 t 個約數的最小數非常感興趣,并 把它定義為 S t 。 例如 S 1 = 1, S 2 = 2, S 3 = 4, S 4 = 6,· · · 。 現在小明想知道,前 60 個 S i 的和是多少?即 S 1 + S 2 + · · · + S 60 是多少? 【分析】 本題其實不難,就是數目太大,題目中求約數有1-60的數總和,已知100以內的質因數有2,3,5,7,11,13,17…等,然后舉個例子,當求約數為10的數的時候,給10分解因數,為2*5,這個數就是2^(5-1) * 3 ^(2-1)=48,按照這個規律可以求出S1到S60的和。規律就是這個數的約數分解因數,然后從大到小分別給質因數當次方-1,最后求每一項的乘積,就是這個數 【代碼演示】
import java.util.ArrayList;import java.util.LinkedList;import java.util.List;publicclassMain{/*** 學習了約數后,小明對于約數很好奇* 他發現,給定一個正整數 t,總是可以找到含有 t個約數的整數* 小明對于含有 t 個約數的最小數非常感興趣,并 把它定義為 St* 例如 S1 = 1, S2 = 2, S3 = 4, S4 = 6,···。 現在小明想知道* 前 60 個 Si 的和是多少?即 S1 + S2 +···+S60 是多少?*/publicstaticvoidmain(String[] args){//尋找有60個約數的最小數,然后求出有1個到60個的約數的和long sum =0;//記錄總和List<Integer> list =newArrayList<>();for(int i =2; i <=100; i++){if(help(i)!=0){list.add(help(i));}}LinkedList<Integer> link =newLinkedList();for(int i =1; i <61; i++){link =help2(link, i);long som =1;for(int j =0; j < link.size(); j++){som *= Math.pow(list.get(j), link.get(j)-1);}link.clear();sum += som;System.out.println(i +" "+ som);}System.out.println(sum);}//分解質因數publicstaticinthelp(int n){for(int i =2; i < n; i++){if(n % i ==0)return0;if(i == n -1)return n;}return n;}//尋找每個數的約數的因數publicstatic LinkedList<Integer>help2(LinkedList<Integer> linkedList,int n){int k =2;while(n >1){if(n % k ==0){n /= k;linkedList.addFirst(k);}else k++;}return linkedList;}}
【答案:292809912969721375】
試題 F: 最長子序列
【問題描述】 我們稱一個字符串 S 包含字符串 T 是指 T 是 S 的一個子序列,即可以從 字符串 S 中抽出若干個字符,它們按原來的順序組合成一個新的字符串與 T 完 全一樣。 給定兩個字符串 S 和 T,請問 T 中從第一個字符開始最長連續多少個字符 被 S 包含? 【輸入格式】 輸入兩行,每行一個字符串。第一行的字符串為 S,第二行的字符串為 T。 兩個字符串均非空而且只包含大寫英文字母。 【輸出格式】 輸出一個整數,表示答案。 【樣例輸入】 ABCDEABCD AABZ 【樣例輸出】 3 【分析】 使用HashMap的key儲存S字符串每一位,然后value儲存每一位的數量,再循環T的每一位,如果不能從Map里找到該key,就停止,找到之后,value值小于1也停止,如果都符合條件,就cont++ 【代碼演示】
import java.util.HashMap;import java.util.Scanner;publicclassMain{/*** 我們稱一個字符串 S 包含字符串 T 是指 T 是 S 的一個子序列,* 即可以從 字符串 S 中抽出若干個字符,它們按原來的順序組合成一個新的字符串與 T 完 全一樣* 給定兩個字符串 S 和 T,請問 T 中從第一個字符開始最長連續多少個字符 被 S 包含?* * 【輸入格式】* 輸入兩行,每行一個字符串。第一行的字符串為 S,第二行的字符串為 T* 兩個字符串均非空而且只包含大寫英文字母。* * 【輸出格式】* 輸出一個整數,表示答案。* 【樣例輸入】 ABCDEABCD* AABZ* * 【樣例輸出】 3*/publicstaticvoidmain(String[] args){Scanner sr =newScanner(System.in);String S = sr.next();String T = sr.next();int cont =0;HashMap<Character, Integer> map =newHashMap();for(int i =0; i < S.length(); i++){if(map.get(S.charAt(i))== null){map.put(S.charAt(i),1);continue;}map.put(S.charAt(i), map.get(S.charAt(i))+1);}for(int i =0; i < T.length(); i++){if(map.get(T.charAt(i))== null)break;if(map.get(T.charAt(i))>0){cont++;map.put(T.charAt(i), map.get(T.charAt(i))-1);}}System.out.println(cont);}}
試題 G: 數正方形
【問題描述】 在一個 N × N 的點陣上,取其中 4 個點恰好組成一個正方形的 4 個頂點, 一共有多少種不同的取法? 由于結果可能非常大,你只需要輸出模 10^9 + 7 的余數