結果
問題 | No.300 平方数 |
ユーザー |
|
提出日時 | 2016-05-18 18:43:11 |
言語 | Java (openjdk 23) |
結果 |
AC
|
実行時間 | 188 ms / 1,000 ms |
コード長 | 1,764 bytes |
コンパイル時間 | 2,889 ms |
コンパイル使用メモリ | 79,196 KB |
実行使用メモリ | 59,292 KB |
最終ジャッジ日時 | 2024-10-06 05:34:33 |
合計ジャッジ時間 | 12,193 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 43 |
ソースコード
package yukicoder;import java.util.ArrayList;import java.util.Arrays;import java.util.Scanner;public class Main{public static void main(String[] args){new Main().solve();}void solve(){Scanner sc=new Scanner(System.in);long x=sc.nextLong();Prime p=new Prime();ArrayList<Integer> ps=p.primeList(1_000_000);ArrayList<Factor> fs=p.primeFactorF(ps, x);long y=1;for(Factor f:fs){if(f.exp%2==0){continue;}else{y*=f.base;}}System.out.println(y);}class Prime{boolean[] isPrimeArray(int max){boolean[] isPrime=new boolean[max+1];Arrays.fill(isPrime, true);isPrime[0]=isPrime[1]=false;for(int i=2;i*i<=max;i++){if(isPrime[i]){for(int j=2;j*i<=max;j++){isPrime[j*i]=false;}}}return isPrime;}/** max以下の素数のリストを返す*/ArrayList<Integer> primeList(int max){boolean[] isPrime=isPrimeArray(max);ArrayList<Integer> primeList=new ArrayList<Integer>();for(int i=2;i<=max;i++){if(isPrime[i]){primeList.add(i);}}return primeList;}/** numをprimeListの素数をもとに素因数分解し、因数を* ArrayList<Factor>の形で返す。* primeListにはnumの平方根以下の素数が含まれていなければならない。**/ArrayList<Factor> primeFactorF(ArrayList<Integer> primeList,long num){ArrayList<Factor> ret=new ArrayList<Factor>();for(int p:primeList){int exp=0;while(num%p==0){num/=p;exp++;}if(exp>0)ret.add(new Factor(p,exp));}if(num>1)ret.add(new Factor(num,1));return ret;}}class Factor{long base,exp;Factor(long base,long exp){this.base=base;this.exp=exp;}}}