2016 ccpc网络赛

/*
    题意:给你n个数,问你从这n个选择一些数相乘后为完全平方数的个数?
    tag: 高斯消元  列方程
    分析:对于每一个数我们有选和不选两种选择,我们将其看成变量xi。然后问题就转化成从n个数中选择一些使得这些数唯一分解式中
    指数对2取模的异或和为0。 然后列出方程求出自由元的个数num答案就是2^num - 1
*/

#include 
#include 
#include 

using namespace std;
typedef long long LL;
const int mod = 1000000007;
int n;
int pm[2000], npm;

void get_prime() {
    bool is_heshu[2000 + 100];
    memset(is_heshu, 0, sizeof(is_heshu));
    for(int i=2; i<=2000; i++) {
        if(is_heshu[i])  continue;
        pm[npm++] = i;
        for(int j=i+i; j<=2000; j+=i) is_heshu[j] = true;
    }
}
int equ, var;      //有equ个方程 var个变量
int A[1000][1000];
int free_num;

int gauss() {
    free_num = 0;
    int k, col;
    for(k=0, col=0; k abs(A[max_r][col])) max_r = i;
        if(max_r != k)
        for(int j=k; j<=var; j++) swap(A[k][j], A[max_r][j]);
        if(A[k][col] == 0) {
            k--;
            free_num++;
            continue;
        }
        for(int i=k+1; i>= 1;
    }
    return res;
}

int main() {
    int T; scanf("%d", &T);
    get_prime();
//    printf("npm = %d\n", npm);
//    for(int i=0; i



/*
    题意:给你一个N*M的方格, 方格内本来有一些数字, 但是不幸的是数字消失了, 现在只记住了一些数字中的最小值得地方,
    问你有多少种填数字的方案满足这些谷点?
    tag:dfs + 容斥 + 状态压缩dp
    分析:我们考虑从小往大往格子里面填数字, 定义dp[i][j]为已经填了i个格子, X填涂的情况为j的方案数。
    那么dp[i][j] = dp[i-1][j] * (往.填的方案数) + dp[i-1][k] k为j中的一个X没有填涂。
    这种计数方法会使一些.的位置变成X, 比如...X, 我们可能会将X..X也计入, 因此下面就需要去重, 去重的时候我们使用
    容斥原理即可。   参考论文: 状态压缩动态规划中的状态与时间
*/

#include 
#include 
#include 
#include 

using namespace std;
typedef long long LL;
const int mod = 772002;
int N, M;
char Map[10][10];
LL dp[30][1<<12];

int num1[1<<15];
int cnt(int st) {
    int res = 0;
    for(int i=0; i<15; i++) if(((st>>i)&1) == 1) res++;
    return res;
}

int dx[] = {-1, -1, -1, 0, 0, 1, 1, 1};
int dy[] = {-1, 0, 1, -1, 1, -1, 0, 1};
bool inside(int x, int y) {
    return (x>=0&&x=0&&y, int>&mp, int st) {   //看看当前.周围有没有没有涂过色的X
    for(int i=0; i<8; i++) {
        int nx = x + dx[i], ny = y + dy[i];
        if(!inside(nx, ny)) continue;
        if(Map[nx][ny] == 'X' && ((st>>mp[make_pair(nx, ny)])&1)==0)
            return true;
    }
    return false;
}

int tp2[1<<14];

LL calc() {
    memset(dp, 0, sizeof(dp));
    int idx = 0;
    map, int> mp;
    for(int i=0; i>mp[make_pair(r, c)])&1)==0) tp++;
            else if(judge(r, c, mp, j)) tp++;
        }
        int tp3 = N*M - tp;
        tp2[j] = tp3;
    }
    dp[0][0] = 1;
    for(int i=1; i<=N*M; i++) for(int j=0; j<(1< i) continue;
        for(int k=0; k>k)&1)==1) dp[i][j] += dp[i-1][j^(1< 0) dp[i][j] += tp*dp[i-1][j];
        dp[i][j] %= mod;
    }
    return dp[N*M][(1<


 
  


你可能感兴趣的:(2016 ccpc网络赛)