【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());
        }
    }
}
原文地址:https://www.cnblogs.com/AWCXV/p/10468326.html