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());
            }
        }
    }
    
  • 相关阅读:
    C语言-define 与do{}while(0)
    Altium Designer 15 --- PCB 3D View
    算法工程师
    VS2015安装失败
    C++11新标准学习
    Sophus VS2010编译不支持?C++11语法的缘故。那有没有不带C++11特性的Sophus版本呢?
    如何学习C++? C++ Primer第三版中文版
    C++智能指针shared_ptr
    C++创建自己的库文件(dll文件创建和编译)
    ARKit对安卓的提示 ARKit与Google Tango
  • 原文地址:https://www.cnblogs.com/AWCXV/p/10468326.html
Copyright © 2011-2022 走看看