zoukankan      html  css  js  c++  java
  • 【CF EDU59 D】Compression

    题意

    给定一个n阶方阵A,现在要从里面取出一个n/x阶子方阵B,使得使得对于对于A中每一个元素,都有
    ,求x的最大值

    分析

    考虑这个关系式

    (frac{i}{x}-1 = frac{i-x}{x})

    也就是说,(B[frac{i}{x}][frac{j}{x}] = A[i-x+p][j-x+q] (1leq p,q leq x))

    可以看出这是一个x阶子方阵矩阵

    其实我们要求的就是将A平均分割成(frac{n}{x}×frac{n}{x})个x阶方阵,每个方阵内的元素全都相等,求最大的x

    我在这里维护了一个二维前缀和,这样对于一个子矩阵,只有和为0,或者和为矩阵的大小的时候满足元素全都相等的条件

    根号n暴力枚举X即可求得答案

    代码

    #include<bits/stdc++.h>
    using namespace std;
    int a[5201][5201];
    int n;
    int input(){
        char ch;
        scanf(" %c",&ch);
        if(ch<='9'&&ch>='0') return ch-'0';
        return ch-'A'+10;
    }
    int main() {
        scanf("%d",&n);
        for(int i=1;i<=n;i++) {
    	for(int j=1;j<=n;j+=4) {
    	    int now = input();
    	    for(int k=j,o=3;o>=0;k++,o--){
    		a[i][k] = a[i-1][k] + a[i][k-1] - a[i-1][k-1] + ((now>>o)&1);
    	    }
    
    	}
        }
        int maxx = 0;
        for(int i=1;i*i<=n;i++) {
    	if(n%i)continue;
    	int _ = i;
    	bool flag = 0;
    	for(int xbe = 1,xen = _;xbe<=n;xbe+=_,xen+=_) {
    	    for(int ybe = 1,yen = _;ybe<=n;ybe+=_,yen+=_){
    		int sum = a[xen][yen]- a[xbe-1][yen] - a[xen][ybe-1] + a[xbe-1][ybe-1];
    		if(sum !=0 && sum != _*_) {
    		    flag = 1;
    		    break;
    		}
    	    }
    	    if(flag)break;
    	}
    	if(flag == 0) maxx = max(maxx,_);
    	if(n/i!=_){
    		_ = n/i;
    	    bool flag = 0;
    	    for(int xbe = 1,xen = _;xbe<=n;xbe+=_,xen+=_) {
    		for(int ybe = 1,yen = _;ybe<=n;ybe+=_,yen+=_){
    		    int sum = a[xen][yen]- a[xbe-1][yen] - a[xen][ybe-1] + a[xbe-1][ybe-1];
    		    if(sum !=0 && sum != _*_) {
    			flag = 1;
    			break;
    		    }
    		}
    		if(flag)break;
    	    }
    	    if(flag == 0) maxx = max(maxx,_);
    
    	}
        }
        cout<<maxx<<endl;
    }
    
  • 相关阅读:
    adfs环境安装
    joinquant网站
    test
    对C转换说明符的误解以及关于数组的一些知识
    正确求平方根的整数部分方法
    单链表的交换排序法
    链表的冒泡排序
    240页345题
    C语言中对数组名取地址
    单链表的基础操作练习
  • 原文地址:https://www.cnblogs.com/greenty1208/p/10332400.html
Copyright © 2011-2022 走看看