2019浙江省赛B zoj4101 Element Swapping(推公式)
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(推公式)的更多相关文章
- 2019浙江省赛K zoj4110 Strings in the Pocket(manachar)
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=6012 题意 给你两个串,可以翻转a串的一个区间,问有多少对l,r使得翻转后的a ...
- 2019浙江省赛 Strings in the Pocket【manacher】
Strings in the Pocket 题目链接 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=6012 题意 给你两个字符 ...
- ZOJ4110 Strings in the Pocket(2019浙江省赛)
给出两个字符串,询问有多少种反转方法可以使字符串1变成字符串2. 如果两个串相同,就用马拉车算法找回文串的数量~ 如果两个串不同,从前往后找第一个不同的位置l,从后往前找第二个不同的位置r,反转l和r ...
- ZOJ4109 Welcome Party(2019浙江省赛)
并查集算连通块的数量,集合的个数就是必然不开心的人数,再跑bfs,用优先队列维护~ #include<bits/stdc++.h> using namespace std; ; vecto ...
- ZOJ4104 Sequence in the Pocket(2019浙江省赛)
思维~ #include<bits/stdc++.h> using namespace std; ; int a[maxn]; int b[maxn]; int N; int main ( ...
- ZOJ4103 Traveler(2019浙江省赛)
构造+思维~ #include<bits/stdc++.h> using namespace std; ; int N,M,T; int visit[maxn]; stack<int ...
- ZOJ4102 Array in the Pocket(2019浙江省赛)
贪心~ #include<bits/stdc++.h> using namespace std; ; int a[maxn]; int b[maxn]; int vis[maxn]; se ...
- 【2021 ICPC Asia Jinan 区域赛】 C Optimal Strategy推公式-组合数-逆元快速幂
题目链接 题目详情 (pintia.cn) 题目 题意 有n个物品在他们面前,编号从1自n.两人轮流移走物品.在移动中,玩家选择未被拿走的物品并将其拿走.当所有物品被拿走时,游戏就结束了.任何一个玩家 ...
- hdu6578 2019湖南省赛D题Modulo Nine 经典dp
目录 题目 解析 AC_Code @ 题目 第一题题意是一共有{0,1,2,3}四种数字供选择,问有多少个长度为n的序列满足所有m个条件,每个条件是说区间[L,R]内必须有恰好x个不同的数字. 第二题 ...
随机推荐
- ARM-start.s注释(2410Init.s)
本人只是做个笔记保存一下. 来源:http://blog.itpub.net/13771794/viewspace-478463/ ;================================= ...
- 【译】为什么BERT有3个嵌入层,它们都是如何实现的
目录 引言 概览 Token Embeddings 作用 实现 Segment Embeddings 作用 实现 Position Embeddings 作用 实现 合成表示 结论 参考文献 本文翻译 ...
- 【转】BFG Repo-Cleaner: Removes large or troublesome blobs like git-filter-branch does, but faster.
https://rtyley.github.io/bfg-repo-cleaner/ an alternative to git-filter-branch The BFG is a simpler, ...
- 其它 nginx
原地址忘了 常用命令: 在CMD下输入如下命令,可以强行关闭所有Nginx进程 taskkill /f /im nginx.exe start nginx nginx -s stop nginx -s ...
- layui-xtree 设置单选框,只能选一个
以下是js代码,首先获取所有节点,再设置只有当前点击的节点状态为选中状态 $.ajax({ type: 'get', url: url, error: function(err){ layer.ale ...
- 【笔记】Python基础五:装饰器
一,什么是装饰器 本质就是函数,功能是为其他函数添加附加功能 原则: 1,不修改被修饰函数的源代码 2,不修改被修饰函数的调用方式 例子: import time def timmer(func): ...
- fyi
<div> <h5 class="page-header">人件费预测项目管理</h5> <hr></div><d ...
- poj_3045 贪心
Farmer John's N (1 <= N <= 50,000) cows (numbered 1..N) are planning to run away and join the ...
- grep -iq 与grep -qi 意思
就是有的时候你不需要直接打印出结果,比如在shell脚本中,你只需要知道grep有没有找到指定的字符串,而不需要满屏幕打印出来,因为那样会很难看.这只可以加-q选项,执行结果是:如果找到了,会返回0, ...
- 跳转Activity时清除当前Activity
void GotoMainActivity(){ Intent intent = new Intent(ProductionInformationActivity.this, MainActivity ...