题目
题意给定n个整数ai,定义H(ai,aj)的值为 H(ai,aj) = concat(ai,aj) * cancat(aj,ai) + ai*aj(mod 3) 其中concat(ai,aj)表示两个数的拼接,如concat(23,14)=2314,而concat(14,23)=1423。
现要求将这n个数平均分成2组,使得不同组之间的任意两个元素,它们的H值取值不能为Z。Z可以自己定义,可以为0,1,或2。
思路c o n c a t ( a i , a j ) = a i ∗ 1 0 k + a j concat(ai,aj) = ai * 10^k + aj concat(ai,aj)=ai∗10k+aj 而由于10 % 3 == 1,所以 c o n c a t ( a i , a j ) = a i ∗ 1 0 k + a j = a i ∗ 1 k + a j = a i + a j concat(ai,aj) = ai * 10^k + aj = ai * 1^k + aj =ai+aj concat(ai,aj)=ai∗10k+aj=ai∗1k+aj=ai+aj,(mod 3) 所以 H ( a i , a j ) = ( a i + a j ) ∗ ( a i + a j ) + a i ∗ a j = a i 2 + a j 2 + 3 ∗ a i ∗ a j = a i 2 + a j 2 H(ai,aj)=(ai+aj)*(ai+aj) + ai*aj = ai^2+aj^2+3*ai*aj=ai^2+aj^2 H(ai,aj)=(ai+aj)∗(ai+aj)+ai∗aj=ai2+aj2+3∗ai∗aj=ai2+aj2,(mod 3)
又因为 0 ∗ 0 = 0 , 1 ∗ 1 = 1 , 2 ∗ 2 = 1 0*0 = 0,1*1 =1,2*2=1 0∗0=0,1∗1=1,2∗2=1(mod 3)。 统计ai^2模3为0和非0的个数,
- 如果0的个数有一半,则取它们做为一组,此时Z取2
- 如果非0的个数有一半,则取它们做为一组,此时Z取0
#include
using namespace std;
#define ll long long
const int maxn = 200010;
const int mod = 1e9 + 7;
int n, x;
int a[maxn];
vector p[2];
char s[maxn];
void solve() {
scanf("%d", &n);
for (int i = 0; i
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?