奇偶性

「AGC043B」123 Triangle「思维」

三世轮回 提交于 2020-03-23 13:33:27
题意: https://www.luogu.com.cn/problem/AT5799 题解:先把所有数减一。可以发现,把距离运算改成xor,就可以求出答案的奇偶性。 答案的奇偶性为 \(\left(\sum { {n-1}\choose {i-1}}\right) \bmod 2\) 如果是奇数,直接输出 \(1\) ,否则考虑是 \(0\) 还是 \(2\) 。 如果序列存在 \(1\) ,可以发现答案一定是 \(0\) 。证明可以使用数学归纳法,从最终状态往起始状态归纳,就能发现答案是 \(2\) 时原序列不存在 \(1\) 。 那么剩下的情况就是求一个 \(02\) 序列的答案。直接变成 \(01\) 序列求奇偶性就行了。 #include <algorithm> #include <cstdio> using namespace std; const int N = 1e6 + 10; int a[N], n; char s[N]; int main() { scanf("%d%s", &n, s); n --; for(int i = 0; i <= n; i ++) { a[i] = s[i] - '0' - 1; } int ans = 0; for(int i = 0; i <= n; i ++) { if((n & i) == i) ans ^= a[i] &

1126: 布尔矩阵的奇偶性

感情迁移 提交于 2020-03-09 06:54:36
1126: 布尔矩阵的奇偶性 时间限制: 1 Sec 内存限制: 128 MB 提交: 6369 解决: 2109 [状态] [讨论版] [提交] [命题人:admin] 题目描述 一个布尔方阵具有奇偶均势特性,当且仅当 每行、每列总和为偶数,即包含偶数个1。如下面这个4*4的矩阵就具有奇偶均势特性: 1 0 1 0 0 0 0 0 1 1 1 1 0 1 0 1 编写程序,读入一个n阶方阵并检查它是否具有奇偶均势特性。如果没有,你的程序应当再检查一下它是否可以通过修改一位(把0改为1,把1改为0)来使它具有奇偶均势特性;如果不可能,这个矩阵就被认为是破坏了。 输入 第一行是一个整数n ( 0< n < 100 ),代表该方阵的阶数。然后输入n 行,每行n个整数(0或1)。 输出 如果矩阵是布尔矩阵,输出“OK”;如果能通过只修改该矩阵中的一位来使它成为布尔矩阵,则输出“Change bit(i,j)”,这里i和j是被修改的元素的行与列(行,列号从0开始);否则,输出“Corrupt”。 样例输入 Copy 4 1 0 1 0 0 0 0 0 1 1 1 1 0 1 0 1 样例输出 Copy OK # include <stdio.h> int a [ 100 ] [ 100 ] ; int judge ( int b [ 100 ] [ 100 ] , int n ) {

HDU - 4388 (Stone Game II)

被刻印的时光 ゝ 提交于 2020-03-04 23:46:45
题意:给定 n 堆石子,每次可以进行如下一回合操作: ①选择一堆石子并取走部分石子,设这堆石子有 s 块,取走部分后剩下 k 块,需满足的条件是 k^s < s; ②新添加一堆大小为 k^s 的石子,而且整个游戏中两玩家各有一次机会把 (k^s) 替换成 ((2k)^s); 问先手是否必胜; 分析: 不管替换,先考虑只有一堆石子共 s 块,每次操作相当于把一堆 s 分成 k 和 k^s 两堆,我们知道当一堆石子的数量为 2^u 的形式时是不可再分的了(不可能满足条件①),那么最后我们会把这堆石子分成 m 堆,且每堆都满足 2^u 的形式,则共分了 m-1 次,若 m-1 为奇数则先手必败,为偶数则先手必胜;所以我们在意的是 m 堆的奇偶性,再回到操作①的约束下,k 和 k^s 的奇偶性和 是等于 s 的奇偶性的(稍微理解一下异或),所以奇偶性永远不会改变,则我们可以计算 s 的二进制 1 的奇偶性来判断,而对于替换操作,((2k)^s)与(k^s) 的奇偶性也是一致的,所以根本不用管; 所以对于 n 堆石子,对每一堆数量二进制 1 的个数为偶数的数量做异或和; 代码: #include<cstdio> #include<iostream> using namespace std; int bitcount(int x){ int ans=0; while(x){ x=x&(x-1)

学习八数码拓展

◇◆丶佛笑我妖孽 提交于 2020-02-17 13:20:00
前言 八数码这个数一数二的入门题目,想必大家都会了。 八数码题目描述 输入源八数码形状,输出移到目标形状所需步数。 以前以为八数码拓展就是用IDA*、双向广搜等高大上的搜索来做。 然而,有更高级的八数码问题。 引入 我们看到这样的一道题: jzoj100030. 【NOIP2017提高A组模拟7.8】为了爱情 题意是: 给你多个n*n的八数码矩阵(n为奇数且小于100),要求判断这个八数码矩阵能否还原为原来的样子 例: 123 456 078 可以还原为 123 456 780 至此,我们发现,这题直接暴力是很难搞的,加优化也无济于事。 能否转移模型呢? 正题 首先,我们考虑3 * 3的情况。 先把原序列变成一个3 * 3的一维序列:123456780这样的形式。 我们发现,如果把0向左边或向右边移动一格时,我们发现,原序列的逆序对的个数不变。 但是,把0向上或向下移动一格时,就相当于把交换的数字在序列中向前或向后交换2次。 所以,每次交换对于逆序对来说,只用2种情况—— 1、当交换的两个数都比之大或小,则逆序对个数加2或减2 2、当交换的两个数一个比之大,一个比之小,则逆序对个数不变。 那么再这种情况下,无论如何,逆序对的奇偶性就是不变的。 而逆序对的大小可以无限调动。 那么就可以发现, 只要初始的序列的逆序对奇偶性与结束的序列的逆序对的奇偶性相等,那么一定可以达到目标。

边带权并查集 +离散化 acwing 239

雨燕双飞 提交于 2020-02-06 12:45:46
题意: 一个01序列s,有一些关系l r odd,或者是l r even,分别代表在[l,r]区间内,有奇数个1,有偶数个1. 问最早出现冲突的下标-1. 思路: 用前缀和的思想考虑,l到r的区间,1的个数的奇偶性,就是1~(l-1)的1的个数的奇偶性和1~r的1的个数的奇偶性的关系。 如果sum[l-1]和sum[r]奇偶性相同,那么l到r的1的个数就是偶数,不同就是奇数。 用并查集去维护每个点和祖先的关系,d数组代表和祖先之间的1的个数的奇偶性,偶数为0,奇数为1。 运算规则和异或一样,偶数和偶数为偶数,奇数和奇数为偶数,奇数和偶数为奇数。 合并的时候,x,和y合并。fa[fx]=fy;要计算d[fx]。 x~y的路径:x~fx fx~fy fy~y,x和y的关系a[i].ans=d[x]^d[y]^d[fx]。 d[fx]=d[x]^d[y]^a[i].ans; #pragma warning(disable:4996) #include<algorithm> #include<cmath> #include<iostream> #include<cstdio> #include<cstring> #include<stack> #include<vector> #include<map> #include<string> #include<set> #include

ZZULIOJ 1126: 布尔矩阵的奇偶性

扶醉桌前 提交于 2020-02-02 00:46:03
题目描述 一个布尔方阵具有奇偶均势特性,当且仅当 每行、每列总和为偶数,即包含偶数个1。如下面这个4*4的矩阵就具有奇偶均势特性: 1 0 1 0 0 0 0 0 1 1 1 1 0 1 0 1 编写程序,读入一个n阶方阵并检查它是否具有奇偶均势特性。如果没有,你的程序应当再检查一下它是否可以通过修改一位(把0改为1,把1改为0)来使它具有奇偶均势特性;如果不可能,这个矩阵就被认为是破坏了。 输入 第一行是一个整数n ( 0< n < 100 ),代表该方阵的阶数。然后输入n 行,每行n个整数(0或1)。 输出 如果矩阵是布尔矩阵,输出“OK”;如果能通过只修改该矩阵中的一位来使它成为布尔矩阵,则输出“Change bit(i,j)”,这里i和j是被修改的元素的行与列(行,列号从0开始);否则,输出“Corrupt”。 样例输入 4 1 0 1 0 0 0 0 0 1 1 1 1 0 1 0 1 样例输出 OK #include<stdio.h> #define N 100 int a[100][100]; int main(){ int n,i,j,s,count=0,b=-1,c=-1; //b记录需要改变的行,c记录需要改变的列 scanf("%d",&n); for(i=0;i<n;i++){ for(j=0;j<n;j++){ scanf("%d",&a[i][j]);

Comet OJ - Contest #4 B题 奇偶性

吃可爱长大的小学妹 提交于 2020-01-17 02:25:22
题目链接: https://www.cometoj.com/contest/39/problem/B?problem_id=1577 题意:给你一个数列,求L 到 R 区间内 所有数列 (ƒ n mod 2)的和。 思路:这题是个找规律的题目,首先数列都要对2取模运算,如果这个数是偶数 那么mod 2就是0,奇数就是1,所以这题等价于求 L 到 R 区间内奇数的个数。    1.当 k 为奇数的时候,我们发现数列的值对2取模后全为1,所以 ans = R - L + 1。    2.当 k 为偶数的时候,假设 k = 4,那么: ƒ 0 ƒ 1 ƒ 2 ƒ 3 ƒ 4 ƒ 5 ƒ 6 ƒ 7 ƒ 8 ƒ 9 ƒ 10 ƒ 11 ƒ 12 ƒ 13 ƒ 14 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0    我们知道偶数个奇数相加和等于偶数,奇数个等于奇数,为了方便我们用 1 表示奇数 用 0 表示偶数。    如图 可以发现循环的规律,我们用除法取模的方法可以算出 1 - n 区间内 0 的节点有 ((n - k) / (k + 1) + 1) 个,所以对 k 所在区间进行分类讨论就好了。 AC代码: 1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 using namespace std

HAUTOJ1126布尔矩阵的奇偶性

那年仲夏 提交于 2020-01-15 05:11:14
# include <stdio.h> # define N 110 void TArrInput ( int x , int y , int a [ N ] [ N ] ) { int i , j ; for ( i = 0 ; i < x ; i ++ ) for ( j = 0 ; j < y ; j ++ ) scanf ( "%d" , & a [ i ] [ j ] ) ; } void BalanceMatrix ( int a [ N ] [ N ] , int n ) { int i , j ; int sum ; int k = 0 , l = 0 ; int x , y ; for ( i = 0 ; i < n ; i ++ ) { sum = 0 ; for ( j = 0 ; j < n ; j ++ ) { sum + = a [ i ] [ j ] ; } if ( sum % 2 == 1 ) { k ++ ; x = i ; } } for ( j = 0 ; j < n ; j ++ ) { sum = 0 ; for ( i = 0 ; i < n ; i ++ ) { sum + = a [ i ] [ j ] ; } if ( sum % 2 == 1 ) { l ++ ; y = j ; } } if ( k == 1 && l ==

6-12 判断奇偶性【PAT】

荒凉一梦 提交于 2020-01-02 16:19:40
题目:   要求实现判断给定整数奇偶性的函数。 函数接口定义: int even( int n );   其中n是用户传入的整型参数。当n为偶数时,函数返回1;n为奇数时返回0。注意:0是偶数。 裁判测试程序样例: # include <stdio.h> int even ( int n ) ; int main ( ) { int n ; scanf ( "%d" , & n ) ; if ( even ( n ) ) printf ( "%d is even.\n" , n ) ; else printf ( "%d is odd.\n" , n ) ; return 0 ; } /* 你的代码将被嵌在这里 */ 输入样例1: -6 ####输出样例1: -6 is even. ####输入样例2: 5 输出样例2: 5 is odd. 思路:   先判断传入函数的数字是否为0,如果是0,直接返回1;如果小于0,则求其绝对值(乘以-1或者用abs函数),然后对其求模取余,如果余数等于0则说明是偶数,返回1,否则返回1即可。 AC代码: int even ( int n ) { if ( n == 0 ) return 1 ; else if ( n < 0 ) n * = - 1 ; if ( n % 2 == 0 ) return 1 ; else return 0 ; }

Java-判断输入数字的奇偶性

有些话、适合烂在心里 提交于 2019-12-18 03:32:03
1 import java.io.InputStream; 2 import java.util.Scanner; 3 4 public class ParityCheck { 5 public static void main(String[] args) { 6 boolean boo=true; 7 while(boo){ 8 System.out.println("enter a number"); 9 try {//排除用户输入字符 10 Scanner input=new Scanner(System.in);//接受用户输入的字符 11 int number=input.nextInt(); 12 if(number%2==0){//判断奇偶性 13 System.out.println("it is an even number"); 14 } 15 else 16 { 17 System.out.println("it is odd"); 18 } 19 } catch (Exception e) { 20 System.out.println("please enter a correct number instead of a character"); 21 continue; 22 } 23 boo=false; 24 } 25 } 26 } 来源: