• P2671 求和


    题目描述

    一条狭长的纸带被均匀划分出了 nn 个格子,格子编号从 11 到 nn 。每个格子上都染了一种颜色 color\_icolor_i 用 [1,m][1,m] 当中的一个整数表示),并且写了一个数字 number\_inumber_i 。

    定义一种特殊的三元组: (x,y,z)(x,y,z) ,其中 x,y,zx,y,z 都代表纸带上格子的编号,这里的三元组要求满足以下两个条件:

    1. xyzxyz 是整数, x<y<z,y-x=z-yx<y<z,yx=zy

    2. colorx=colorzcolorx=colorz

    满足上述条件的三元组的分数规定为 (x+z) imes (number\_x+number\_z)(x+z)×(number_x+number_z) 。整个纸带的分数规定为所有满足条件的三元组的分数的和。这个分数可能会很大,你只要输出整个纸带的分数除以 10,00710,007 所得的余数即可。

    输入输出格式

    输入格式:

     

    第一行是用一个空格隔开的两个正整数 nn 和 m,nm,n 表纸带上格子的个数, mm 表纸带上颜色的种类数。

    第二行有 nn 用空格隔开的正整数,第 ii 数字 numbernumber 表纸带上编号为 ii 格子上面写的数字。

    第三行有 nn 用空格隔开的正整数,第 ii 数字 colorcolor 表纸带上编号为 ii 格子染的颜色。

     

    输出格式:

     

    一个整数,表示所求的纸带分数除以 1000710007 所得的余数。

     

    输入输出样例

    输入样例#1: 
    6 2
    5 5 3 2 2 2
    2 2 1 1 2 1
    输出样例#1: 
    82
    
    输入样例#2: 
    15 4
    5 10 8 2 2 2 9 9 7 7 5 6 4 2 4
    2 2 3 3 4 3 3 2 4 4 4 4 1 1 1
    输出样例#2: 
    1388

    说明

    【输入输出样例 1 说明】

    纸带如题目描述中的图所示。

    所有满足条件的三元组为: (1, 3, 5), (4, 5, 6)(1,3,5),(4,5,6) 。

    所以纸带的分数为 (1 + 5) imes (5 + 2) + (4 + 6) imes (2 + 2) = 42 + 40 = 82(1+5)×(5+2)+(4+6)×(2+2)=42+40=82 。

    对于第 11 组至第 22 组数据, 1 ≤ n ≤ 100, 1 ≤ m ≤ 51n100,1m5 ;

    对于第 33 组至第 44 组数据, 1 ≤ n ≤ 3000, 1 ≤ m ≤ 1001n3000,1m100 ;

    对于第 55 组至第 66 组数据, 1 ≤ n ≤ 100000, 1 ≤ m ≤ 1000001n100000,1m100000 ,且不存在出现次数超过 2020 的颜色;

    对 于 全 部 1010 组 数 据 , 1 ≤ n ≤ 100000, 1 ≤ m ≤ 100000, 1 ≤ color\_i ≤ m,1≤number\_i≤1000001n100000,1m100000,1color_im,1number_i100000

    Solution:

      本题zyys的普及题目。

      首先我们不难发现$2y=x+z$,所以$x,z$同奇或同偶,然后化简式子$(x+z)*(num_x+num_z)=x*num_x+x*num_z+z*num_z+z*num_x$。

      于是我们可以分开处理各颜色的奇偶数,然后同一颜色的同奇偶性的就直接求前缀和,最后只需要$O(n)$扫一遍,求每个颜色的方案数,累加统计求和就好了。

    代码:

    #include<bits/stdc++.h>
    #define il inline
    #define ll long long
    #define For(i,a,b) for(int (i)=(a);(i)<=(b);(i)++)
    #define Bor(i,a,b) for(int (i)=(b);(i)>=(a);(i)--)
    #define Max(a,b) ((a)>(b)?(a):(b))
    #define Min(a,b) ((a)>(b)?(b):(a))
    using namespace std;
    const int N=100005,mod=10007;
    ll n,m,col[N][2],num[N],sum[N][2],c[N];
    ll ans;
    
    il int gi(){
        int a=0;char x=getchar();bool f=0;
        while((x<'0'||x>'9')&&x!='-')x=getchar();
        if(x=='-')x=getchar(),f=1;
        while(x>='0'&&x<='9')a=(a<<3)+(a<<1)+x-48,x=getchar();
        return f?-a:a;
    }
    
    int main(){
        n=gi(),m=gi();
        For(i,1,n) num[i]=gi();
        For(i,1,n) {
            c[i]=gi();
            col[c[i]][i%2]++;
            sum[c[i]][i%2]+=num[i];
        }
        For(i,1,n)
            if(col[c[i]][i%2]-1>0)
                ans=(ans+i*num[i]*(col[c[i]][i%2]-1)%mod+i*(sum[c[i]][i%2]-num[i])%mod)%mod;
        cout<<ans;
        return 0;
    }
  • 相关阅读:
    电脑蓝屏的原因及解决方法
    或将引爆第四次工业革命!一张图带你看完人工智能大事件
    sata2.0和sata3.0的区别
    15款顶级的开源人工智能工具推荐
    解读神秘而又强大的百度人工智能计算机
    人工智能让程序员自危:码农大批失业
    电脑开机黑屏只有光标在闪怎么办
    关于XSS漏洞的简介以及分类
    SSD知识
    centos7下安装docker(15.5容器跨主机网络--flanneld)
  • 原文地址:https://www.cnblogs.com/five20/p/9246753.html
Copyright © 2020-2023  润新知