「LYOI2016 Summer」Equation 题解
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了「LYOI2016 Summer」Equation 题解相关的知识,希望对你有一定的参考价值。
此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置。
题目链接:https://ly.men.ci/problem/43
题目描述
输入格式
输出格式
样例
分析:
一开始没看到范围以为这是数学题...k<=600的话,O(n^3)是可以接受的。
把题目中给出的式子移项,变成a1*x1+a3*x3+a5*x5=a2*x2+a4*x4+a6*x6
枚举左边的三个x,计算出左边所有可能值,然后再枚举右边的三个x,如果与左边有相同的话就ans+=相同值的个数。
暴力判断显然是不行的,可以用STL的map。此题开了O2优化,不至于TLE。
时间复杂度O(n^3 * logn)
AC代码:
1 #include<cstdio> 2 #include<algorithm> 3 #include<cmath> 4 #include<cstring> 5 #include<map> 6 7 inline void read(int &x) 8 { 9 char ch = getchar(),c = ch;x = 0; 10 while(ch < ‘0‘ || ch > ‘9‘) c = ch,ch = getchar(); 11 while(ch <= ‘9‘ && ch >= ‘0‘) x = (x<<1)+(x<<3)+ch-‘0‘,ch = getchar(); 12 if(c == ‘-‘) x = -x; 13 } 14 15 std::map<long,long> mp; 16 int ans,k,a1,a2,a3,a4,a5,a6; 17 long long tmp; 18 19 int main() 20 { 21 read(k); 22 read(a1),read(a2),read(a3),read(a4),read(a5),read(a6); 23 for(register int x = 1;x <= k;++ x) 24 for(register int y = 1;y <= k;++ y) 25 for(register int z = 1;z <= k;++ z) 26 { 27 tmp = 1LL*a1*x+1LL*a3*y+1LL*a5*z; 28 mp[tmp] ++; 29 } 30 for(register int x = 1;x <= k;++ x) 31 for(register int y = 1;y <= k;++ y) 32 for(register int z = 1;z <= k;++ z) 33 { 34 tmp = 1LL*a2*x+1LL*a4*y+1LL*a6*z; 35 if(mp.count(tmp)) 36 ans += mp[tmp]; 37 } 38 printf("%d\n",ans); 39 return 0; 40 }
以上是关于「LYOI2016 Summer」Equation 题解的主要内容,如果未能解决你的问题,请参考以下文章
BZOJ4896 [Thu Summer Camp2016]补退选
Petrozavodsk Summer-2016. Warsaw U Contest, XVI Open Cup Onsite.