HDU 5833 高斯消元
2016-08-16 21:28
357 查看
n个数,任选>=1个数相乘,使得乘积是完全平方数。
其实就是开关,控制灯泡。
数 ----第i个质因子p的个数%2 = {1 , 0}
==
开关----第i个灯泡 = {开 , 关}
最后使得所有灯泡都是灭着的方案数 = 2^自由变元个数
全部关着的情况 == 一个数也不选 应省去
其实就是开关,控制灯泡。
数 ----第i个质因子p的个数%2 = {1 , 0}
==
开关----第i个灯泡 = {开 , 关}
最后使得所有灯泡都是灭着的方案数 = 2^自由变元个数
全部关着的情况 == 一个数也不选 应省去
import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.io.PrintWriter; import java.math.BigInteger; import java.util.Arrays; import java.util.StringTokenizer; public class Main { public static void main(String[] args){ new HDU5833().solve() ; } } class HDU5833{ InputReader in = new InputReader(System.in) ; PrintWriter out = new PrintWriter(System.out) ; final int N = 2000 ; int[] prime = new int ; int primeSize ; boolean[] is = new boolean ; { Arrays.fill(is , false) ; primeSize = 0 ; for(int i = 2 ; i < N ; i++){ if(! is[i]) prime[primeSize++] = i ; for(int j = 0 ; j < primeSize && prime[j] * i < N ; j++){ is[i * prime[j]] = true ; if(i % prime[j] == 0) break ; } } } final int MAXN = 318 ; int[][] A = new int[MAXN][MAXN] ; int gauss(int n){ int col , cnt = 0 , row ; for(col = 0 ; col < n ; col++){ for(row = cnt ; row < 303 ; row++){ if(A[row][col] != 0 ) break ; } if(row < 303){ if(row != cnt){ for(int i = 0 ; i < n ; i++){ int t = A[row][i] ; A[row][i] = A[cnt][i] ; A[cnt][i] = t ; } } for(int i = cnt + 1 ; i < 303 ; i++){ if(A[i][col] != 0){ for(int j = col ; j < n ; j++) A[i][j] ^= A[cnt][j] ; } } cnt++ ; } } return n - cnt ; } long[] a = new long[MAXN] ; final long MOD = 1000000007L ; void solve(){ int t = in.nextInt() ; for(int ca = 1 ; ca <= t ; ca++){ int n = in.nextInt() ; for(int i = 0 ; i < n ; i++) a[i] = in.nextLong() ; for(int i = 0 ; i < 303 ; i++){ for(int j = 0 ; j < n ; j++){ int k = 0 ; while(a[j] % prime[i] == 0){ k++ ; a[j] /= prime[i] ; } A[i][j] = k % 2 ; } } int res = gauss(n) ; long ans = 1L ; while(res-- > 0){ ans <<= 1 ; ans %= MOD ; } ans = (ans - 1 + MOD) % MOD ; out.println("Case #" + ca + ":") ; out.println(ans) ; } out.flush() ; } } class InputReader { public BufferedReader reader; public StringTokenizer tokenizer; public InputReader(InputStream stream) { reader = new BufferedReader(new InputStreamReader(stream), 32768); tokenizer = new StringTokenizer(""); } private void eat(String s) { tokenizer = new StringTokenizer(s); } public String nextLine() { try { return reader.readLine(); } catch (Exception e) { return null; } } public boolean hasNext() { while (!tokenizer.hasMoreTokens()) { String s = nextLine(); if (s == null) return false; eat(s); } return true; } public String next() { hasNext(); return tokenizer.nextToken(); } public int nextInt() { return Integer.parseInt(next()); } public long nextLong() { return Long.parseLong(next()); } public double nextDouble() { return Double.parseDouble(next()); } public BigInteger nextBigInteger() { return new BigInteger(next()); } }
相关文章推荐
- 【HDU 5833】Zhu and 772002(异或方程组高斯消元)
- HDU 5833 Zhu and 772002(高斯消元)
- HDU 5833 Zhu and 772002 (高斯消元)
- HDU 5833 Zhu and 772002 (数论+高斯消元)
- HDU 5833 高斯消元
- hdu-5833 Zhu and 772002(高斯消元)
- HDU 5833 高斯消元 异或方程组
- HDU 5833 Zhu and 772002(高斯消元)——2016中国大学生程序设计竞赛 - 网络选拔赛
- HDU 5833 Zhu and 772002(异或方程组高斯消元)
- HDU 5833 Zhu and 772002 (高斯消元)
- Zhu and 772002 HDU - 5833 (高斯消元求异或方程组解的个数)
- (HDU)5833 - Zhu and 772002 【高斯消元】
- HDU-5833 Zhu and 772002(异或方程高斯消元)
- hdu 5833 Zhu and 772002 高斯消元
- HDU 5833 高斯消元
- Zhu and 772002 HDU - 5833 高斯消元
- hdu 5833 2016年中国大学生程序设计竞赛网络赛 高斯消元
- Hdu-5833 Zhu and 772002(高斯消元)
- hdu 5833 Zhu and 772002(高斯消元)
- Hdu 5833 Zhu and 772002 异或方程组高斯消元