zoukankan      html  css  js  c++  java
  • 【Codeforces 364A】Matrix

    【链接】 我是链接,点我呀:)
    【题意】

    让你求出b[i][j]=s[i]*s[j]规则构成的矩阵 的所有子矩阵中子矩阵的和为a的子矩阵的个数

    【题解】

    (x,y,z,t) 会发现它的和就是sum(x,y)*sum(z,t) sum(x,y)=a[x]+a[x+1]+...+a[y] 因为这个子矩阵的和就是 a[x][z]+a[x][z+1]+...+a[x][t] + a[x+1][z] + a[x+1][z+1]....+a[x+1][t] .... 而a[i][j] = a[i]*a[j] 下次遇到这样的就动手算一算和是什么 看看能不能找出规律 注意a=0的时候的情况分类讨论一波 sum(x,y)最多就为9*|s| 因此如果a/i >9*|s|就不用管它

    【代码】

    import java.io.*;
    import java.util.*;
    
    public class Main {
        
        
        static InputReader in;
        static PrintWriter out;
            
        public static void main(String[] args) throws IOException{
            //InputStream ins = new FileInputStream("E:\rush.txt");
            InputStream ins = System.in;
            in = new InputReader(ins);
            out = new PrintWriter(System.out);
            //code start from here
            new Task().solve(in, out);
            out.close();
        }
        
        static int N = 4000;
        static class Task{
            int cnt[] = new int[N*10+100];
            int s[] = new int[N+10];
            String S;
            int a,n;
            
            public void solve(InputReader in,PrintWriter out) {
            	a = in.nextInt();
            	S = in.next();
            	for (int i = 0;i < (int)S.length();i++) {
            		s[i+1] = S.charAt(i)-'0';
            	}
            	n = S.length();
            	for (int i = 1;i <= n;i++) {
            		int temp = 0;
            		for (int j = i;j <= n;j++) {
            			temp = temp + s[j];
            			cnt[temp]++;
            		}
            	}
            	long ans = 0;
            	if (a==0) {
            		//a==0
            		//sum(x,y)*sum(z,t)==0
            		//sum(x,y)==0 sum(z,t)!=0
            		//or sum(x,y)!=0 sum(z,t)==0
            		for (int i = 1;i <=N*10;i++) {
            			ans = ans + 1l*2*cnt[0]*cnt[i];
            		}
            		
            		//sum(x,y)==0 sum(z,t)==0
            		ans = ans + 1l*cnt[0]*cnt[0];
            	}else {
            		for (int i = 1;i <= N*10;i++) {
            			if (a%i==0 && a/i<=(N*10)) {
            				ans = ans + 1l*cnt[i]*cnt[a/i];
            			}
            		}
            	}
            	out.println(ans);
            }
        }
    
        
    
        static class InputReader{
            public BufferedReader br;
            public StringTokenizer tokenizer;
            
            public InputReader(InputStream ins) {
                br = new BufferedReader(new InputStreamReader(ins));
                tokenizer = null;
            }
            
            public String next(){
                while (tokenizer==null || !tokenizer.hasMoreTokens()) {
                    try {
                    tokenizer = new StringTokenizer(br.readLine());
                    }catch(IOException e) {
                        throw new RuntimeException(e);
                    }
                }
                return tokenizer.nextToken();
            }
            
            public int nextInt() {
                return Integer.parseInt(next());
            }
        }
    }
    
  • 相关阅读:
    python的复制,深拷贝和浅拷贝的区别(转)
    linux下ffmpeg安装(转)
    Linux下的tar压缩解压缩命令详解(转)
    centos7安装python-pip(转)
    爬山算法和模拟退火算法简介
    协方差、协方差矩阵定义与计算
    七种常见阈值分割代码(Otsu、最大熵、迭代法、自适应阀值、手动、迭代法、基本全局阈值法)
    Canny边缘检测算法原理及其VC实现详解(二)
    Canny边缘检测算法原理及其VC实现详解(一)
    perforce变量配置与使用
  • 原文地址:https://www.cnblogs.com/AWCXV/p/10468326.html
Copyright © 2011-2022 走看看