http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=6003

题意

\(数组a通过交换一对数字,得到了b数组,给出x=\sum^n_{k=1}ka_k和y=\sum^n_{k=1}ka_k^2和b数组,问有多少对l,r(l<=r)能满足条件\)

题解

  • \(\frac{Y_2-Y_1}{X_2-X_1}=a_i+a_j=b_i+b_j\)
  • \(X_2-X_1 = (a_i-a_j)*(j-i)=(b_j-b_i)*(j-i)\)
  • \(第一个式子左边为一个定值,所以b_i和b_j一一对应,可以枚举b数组\)
  • \(第二个数组可以化为\frac{X_2-X_1+(b_j-b_i)i}{b_j-b_i} = j,假设j>i(方便计数),枚举b_i通过式子一可以计算b_j,然后通过式子二可以计算出j,判一下b_j是否等于j\)
  • \(X_2-X_1=0,Y_2-Y_1\neq0,则不合法\)
  • \(X_2-X_1=0,Y_2-Y_1=0推出a_i=a_j,j\neq i\)
  • \(Y_2和X_2是由b数组计算而得的,而X_1和Y_1是题目提供的,所以存在(X_2-X_1)\nmid (Y_2-Y_1)\)
#include<bits/stdc++.h>
#define ll long long
#define Map map<ll,ll>::iterator
#define MAXN 100005
#define se second
using namespace std;
map<ll,ll>cnt;
ll X1,Y1,X2,Y2,a[MAXN];
int T,n;
int main(){
cin>>T;
while(T--){
cnt.clear();
scanf("%d%lld%lld",&n,&X1,&Y1);
X2=Y2=0;
for(ll i=1;i<=n;i++){
scanf("%lld",&a[i]);
cnt[a[i]]++;
X2+=a[i]*i;Y2+=a[i]*a[i]*i;
}
ll dx=X2-X1,dy=Y2-Y1;
if(dx==0){
if(dy!=0){
puts("0");continue;
}
ll ans=0;
for(Map it=cnt.begin();it!=cnt.end();it++){
ans+=((it->se)-1)*(it->se)/2;
}
printf("%lld\n",ans);
continue;
}
if(dy%dx){
puts("0");continue;
}
//cout<<dx<<" "<<dy<<endl;
ll dt=dy/dx,ans=0;
//cout<<dt<<endl;
for(ll i=1;i<=n;i++){
ll Aj=dt-a[i];
if((Aj-a[i])==0)continue;
ll j=(dx+(Aj-a[i])*i)/(Aj-a[i]);
if(j<=i||j>n)continue;
if(a[j]==Aj)ans++;
}
printf("%lld\n",ans);
}
}

2019浙江省赛B zoj4101 Element Swapping(推公式)的更多相关文章

  1. 2019浙江省赛K zoj4110 Strings in the Pocket(manachar)

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=6012 题意 给你两个串,可以翻转a串的一个区间,问有多少对l,r使得翻转后的a ...

  2. 2019浙江省赛 Strings in the Pocket【manacher】

    Strings in the Pocket 题目链接 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=6012 题意 给你两个字符 ...

  3. ZOJ4110 Strings in the Pocket(2019浙江省赛)

    给出两个字符串,询问有多少种反转方法可以使字符串1变成字符串2. 如果两个串相同,就用马拉车算法找回文串的数量~ 如果两个串不同,从前往后找第一个不同的位置l,从后往前找第二个不同的位置r,反转l和r ...

  4. ZOJ4109 Welcome Party(2019浙江省赛)

    并查集算连通块的数量,集合的个数就是必然不开心的人数,再跑bfs,用优先队列维护~ #include<bits/stdc++.h> using namespace std; ; vecto ...

  5. ZOJ4104 Sequence in the Pocket(2019浙江省赛)

    思维~ #include<bits/stdc++.h> using namespace std; ; int a[maxn]; int b[maxn]; int N; int main ( ...

  6. ZOJ4103 Traveler(2019浙江省赛)

    构造+思维~ #include<bits/stdc++.h> using namespace std; ; int N,M,T; int visit[maxn]; stack<int ...

  7. ZOJ4102 Array in the Pocket(2019浙江省赛)

    贪心~ #include<bits/stdc++.h> using namespace std; ; int a[maxn]; int b[maxn]; int vis[maxn]; se ...

  8. 【2021 ICPC Asia Jinan 区域赛】 C Optimal Strategy推公式-组合数-逆元快速幂

    题目链接 题目详情 (pintia.cn) 题目 题意 有n个物品在他们面前,编号从1自n.两人轮流移走物品.在移动中,玩家选择未被拿走的物品并将其拿走.当所有物品被拿走时,游戏就结束了.任何一个玩家 ...

  9. hdu6578 2019湖南省赛D题Modulo Nine 经典dp

    目录 题目 解析 AC_Code @ 题目 第一题题意是一共有{0,1,2,3}四种数字供选择,问有多少个长度为n的序列满足所有m个条件,每个条件是说区间[L,R]内必须有恰好x个不同的数字. 第二题 ...

随机推荐

  1. ThinkPHP 整合微信支付 扫码支付 模式二 图文教程

    这篇文章主要介绍扫码支付场景二. 目前有两种模式,模式一比模式二稍微复杂点,至于模式一与模式二的具体内容,流程,微信开发文档都有详细介绍,这里就不多说废话,接下来赶紧上教程! [title]下载SDK ...

  2. JS stacktrace(Node内存溢出)

    vscode运行项目时,保存.vue文件,项目突然终止运行.输入命令npm run dev重新运行后,终端显示下面的错误. 解决方案: 如果是run dev时报错,在package.json文件里的s ...

  3. Java运行时数据区

    目录 1. 概述 2. Java内存结构 3. 程序计数器 4. Java虚拟机栈 5. 本地方法栈 6. 堆 7. 方法区 8. 运行时常量池 9. 直接内存 10. 总结 1. 概述 作为日常的J ...

  4. spring、mybatis事务配置和控制

    springmybatis.xml <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi= ...

  5. form表单中$_FILES数组的使用

    <form enctype="multipart/form-data" action="upload.php" method="post&quo ...

  6. C语言博客作业01--分支、顺序结构

    1.本章学习总结 1.1思维导图 1.2本章学习体会及代码量学习体会 1.2.1学习体会 通过本章的学习,学会了三种基本结构以及一些基本的运算知识,学会编写简单的程序,跟着老师的步子学习基本的东西都能 ...

  7. 数据分析三剑客之一numpy

    NumPy系统是Python的一种开源的数值计算扩展.这种工具可用来存储和处理大型矩阵. 可以用python实现的科学计算包括: 1.一个强大的N维数组对象Array: 2.比较成熟的(广播)函数库: ...

  8. splice的用法

    splice向数组中删除/添加新元素,然后返回新数组 arrObject.splice(index,howmany,item1,...,itemx); 参数 描述 index 必需.整数,规定添加/删 ...

  9. cross compile gdbserver

    1. 下载gdb源码,7.12版本,下载地址:ftp://ftp.gnu.org/gnu/gdb.2. 编译gdb:0> cd gdb-7.121> mkdir __install2> ...

  10. 词根:sol = sun(太阳) 词根:sol = alone/single, whole/entire (单独的)

    词根:sol = sun(太阳) sol 这个词根有的书上如刘毅字典,刘洪波英文字根词源精讲等上面说来自拉丁语的sol(=sun),有的书如赢在单词上面说sol 来自拉丁语的solari,但不管哪种说 ...