codeforce #925 (div3) 题解

D. Divisible Pairs

给出数组 a a a,如果二元组 ( i , j ) (i,j) (i,j)满足 a i + a j m o d x = = 0 & & a i − a j m o d y = = 0 a_i + a_j mod x ==0 \&\& a_i - a_j mod y == 0 ai+ajmodx==0&&aiajmody==0,则beauty。其中 i < j i<j i<j

根据题意不难得出,符合条件的二元组应满足
a i m o d    x + a j m o d    x = x a i m o d    y = a j m o d    y a_i \mod x + a_j \mod x = x \\ a_i \mod y = a_j \mod y aimodx+ajmodx=xaimody=ajmody

所以用 ( a i m o d    x , a i m o d    y ) (a_i \mod x, a_i \mod y) (aimodx,aimody)作为key,对于每个元素 a i a_i ai查找 ( x − a i m o d    x , a i m o d    y ) (x- a_i \mod x, a_i \mod y) (xaimodx,aimody)的个数

#include <iostream>
#include <string.h>
#include <algorithm>
#include <math.h>
#include <time.h>
#include <set>
#include <map>
#include <queue>

#define IOS     ios::sync_with_stdio(0);cin.tie(0);
#define rep(index,start,end) for(int index = start;index < end; index ++)
#define drep(index,start,end) for(int index = start;index >= end; index --)

using namespace std;

typedef long long ll;
ll gcd(ll a, ll b){
    ll t;
    while(b){
        t = b;
        b = a % b;
        a = t;
    }
    return a;
}

const int maxn = 2e5+5;


typedef pair<int, int> key;
int n,x,y;
map<key, int> store;
int main() {
    IOS
    
    int t;
    cin>>t;
    while(t--) {
        store.clear();
        
        cin>>n>>x>>y;
        int tmp;
        ll sum = 0LL;
        rep(i,0,n) {
            cin>>tmp;
            int modx = tmp % x;
            int mody = tmp % y;
            key now ={modx, mody};
            
            // cal
            int bmody = tmp % y;
            int bmodx = (x - tmp%x) % x;
            sum += store[{bmodx, bmody}];
            
            
            if (store.find(now) != store.end()) {
                store[now] += 1;
            } else {
                store[now] = 1;
            }
        }

        cout<<sum<<endl;
    }
    return 0;
}

E. Anna and the Valentine’s Day Gift 博弈论

俩人玩游戏,一个能选一个数reverse,一个能选一个数拼接,看最后的结果能不能大于 1 0 m 10^m 10m

如果想要减少最终结果的位数,那么必须reverse之后产生前导零,例如10000,反转后变成1。那么这道题就变成了对反转后产生前导零个数的排序。注意我们的对手不傻,当我们把产生最多前导零的数字反转后,对手肯定会把产生第二多的拼接保护,防止最终结果位数减少,所以只能减去排序结果的偶数位

#include <iostream>
#include <string.h>
#include <algorithm>
#include <math.h>
#include <time.h>
#include <set>
#include <map>
#include <queue>

#define IOS     ios::sync_with_stdio(0);cin.tie(0);
#define rep(index,start,end) for(int index = start;index < end; index ++)
#define drep(index,start,end) for(int index = start;index >= end; index --)

using namespace std;

typedef long long ll;
ll gcd(ll a, ll b){
    ll t;
    while(b){
        t = b;
        b = a % b;
        a = t;
    }
    return a;
}

const int maxn = 2e5+5;

struct node{
    int digit;
    int zero;
};

int n,m;
node store[maxn];
bool cmp(const node& a, const node& b) {
    return a.zero > b.zero;
}
int main() {
    IOS
    
    int t;
    cin>>t;
    while(t--) {
        int tmp;
        cin>>n>>m;
        int sum = 0;
        rep(i,0,n) {
            cin>>tmp;
            int dig = 0;
            int zero = 0;
            bool leading = true;
            while(tmp > 0) {
                dig ++;
                if (leading && !(tmp % 10)) {
                    zero ++;
                } else {
                    leading = false;
                }
                tmp /= 10;
            }
//            cout<<"dig :"<<dig<<" zero:"<<zero<<endl;
            store[i].digit = dig;
            store[i].zero = zero;
            sum += dig;
        }
        
        sort(store, store+n, cmp);
//        cout<<"test log:"<<store[0].zero<<endl;
        for(int i=0;i<n;i+=2) {
            sum -= store[i].zero;
        }
        
        if (sum < m+1) {
            cout<<"Anna"<<endl;
        } else {
            cout<<"Sasha"<<endl;
        }
    }
    
    return 0;
}

https://codeforces.com/contest/1931/problem/F 拓扑排序

给几个数组,第一位没有用,问有没有一个排列能满足这几个数组中元素的先后关系。

数组给出的顺序天然形成有向图。像 1 → 2 1 \rightarrow 2 12 2 → 1 2 \rightarrow 1 21这种矛盾的顺序必然是不存在序列的,也就是说给出的关系不能有环。所以简单套一个拓扑排序就可以了


#include <iostream>
#include <string.h>
#include <algorithm>
#include <math.h>
#include <time.h>
#include <set>
#include <map>
#include <queue>
 
#define IOS     ios::sync_with_stdio(0);cin.tie(0);
#define rep(index,start,end) for(int index = start;index < end; index ++)
#define drep(index,start,end) for(int index = start;index >= end; index --)
 
using namespace std;
 
const int maxn = 2e5+5;
 
int store[maxn];
vector<int> adj[maxn];
int in_degrad[maxn];
queue<int> Q;
int main() {
    IOS
    
    int t;
    cin>>t;
    while(t--) {
        int n,k;
        cin>>n>>k;
        // init
        memset(in_degrad, 0, sizeof(in_degrad));
        rep(i,0,n+1) adj[i].clear();
        while(!Q.empty()) Q.pop();
        
        rep(i,0,k) {
            rep(j,0,n) cin>>store[j];
            
            rep(j,1,n-1) {
                int commonA = store[j];
                int commonB = store[j+1];
                if (find(adj[commonA].begin(), adj[commonA].end(), commonB) == adj[commonA].end()) {
                    adj[commonA].push_back(commonB);
                    in_degrad[commonB] ++;
                }
            }
        }
        
        rep(i,1,n+1) {
            if (!in_degrad[i])
                Q.push(i);
        }
        
        while (!Q.empty()) {
            int now = Q.front();
            Q.pop();
            
            int len = adj[now].size();
            rep(i,0,len) {
                int next = adj[now][i];
                if (-- in_degrad[next] == 0)
                    Q.push(next);
            }
        }
        
        bool _loop = false;
        rep(i,1,n+1)
            if (in_degrad[i]) {
//                cout<<i<<' '<<in_degrad[i]<<endl;
                _loop = true;
                break;
            }
        cout<<(_loop? "NO":"YES")<<endl;
    }
    
    return 0;
}

G. One-Dimensional Puzzle 高二排列组合问题

题干太长懒得翻译 有多少种排列方式可以把给出的所有形状拼成一个长条。

请添加图片描述
大概就是这么个拼接的方法。shape 1和shape 2的个数相差不能超过1,超过就拼不出来;shape 3和shape 4就是造成不同拼接方式的关键,穿插在shape 1和shape 2的间隙,要注意shape 3是可以自拼接,并不是每个间隙只能塞一个

#include <iostream>
#include <string.h>
#include <algorithm>
#include <math.h>
#include <time.h>
#include <set>
#include <map>
#include <queue>

#define IOS     ios::sync_with_stdio(0);cin.tie(0);
#define mem(A,B) memset(A,B,sizeof(A));
#define rep(index,start,end) for(int index = start;index < end; index ++)
#define drep(index,start,end) for(int index = start;index >= end; index --)

using namespace std;

typedef long long ll;

const int maxn = 3e6+5;
const int mod = 998244353;

ll fact[maxn];

ll pow_mod(ll x, ll p) {
    if (p == 0) {
        return 1;
    }
    if (p % 2 == 0) {
        ll y = pow_mod(x, p / 2);
        return (y * y) % mod;
    }
    return (x * pow_mod(x, p - 1)) % mod;
}
 
ll inv(ll x) {
    return pow_mod(x, mod - 2);
}
ll cnk(ll n, ll k) {
    ll res = fact[n];
    res = (res * inv(fact[k])) % mod;
    res = (res * inv(fact[n - k])) % mod;
//    cout<<"n:"<<n<<" k:"<<k<<" res:"<<res<<endl;
    return res;
}
int abs(int num) {
    return num<0 ? -num :num;
}


int store[5];
int main() {
    IOS
    
    fact[0] = fact[1] = 1;
    rep(i,2,maxn)
        fact[i] = (fact[i-1] * i) % mod;
    
    
    int t;
    cin>>t;
    while(t--) {
        rep(i,0,4) cin>>store[i];
        
        if (store[0] == 0 && store[1] == 0) {
            cout<<((store[2]!=0 && store[3] != 0)? 0:1)<<endl;
            continue;
        }
        int dfi = abs(store[1] - store[0]);
        if (dfi > 1) {
            cout<<0<<endl;
            continue;
        }
        
        ll ans = 0;
        if (dfi == 0) {
            // same and not 0
            int x3,x4;
            x3 = store[1];
            x4 = x3 + 1;
            ans += (cnk(store[2]+x3-1, store[2]) * cnk(store[3]+x4-1, store[3])) % mod;
            
            x4 = store[1];
            x3 = x4 + 1;
            ans = ans + (cnk(store[2]+x3-1, store[2]) * cnk(store[3]+x4-1, store[3])) % mod;
            ans = ans % mod;
        } else {
            // greater than one
            int x3,x4;
            x3 = x4 = max(store[0], store[1]);
            ans = (cnk(store[2]+x3-1, store[2]) * cnk(store[3]+x4-1, store[3])) % mod;
        }
        cout<<ans<<endl;
    }
    
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/547099.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot整合消息中间件(ActiveMQ,RabbitMQ,RocketMQ,Kafka)

消息中间件 消息消息队列JMS AMQPMQTTKafka Spring整合消息队列模拟消息队列的工作流程Spring整合ActiveMQSpring整合RabbitMQ直连交换机模式主题交换机模式 Spring整合RocketMQSpring整合kafka 消息 消息的发送方&#xff1a;生产者 消息的接收方&#xff1a;消费者 同步消息…

vite - WebAssembly入门

1. 初始化 vite 项目 1.1 安装 nvm&#xff08;可选&#xff09; brew update brew install nvm在 ~/.zshrc 添加 export NVM_DIR~/.nvm source $(brew --prefix nvm)/nvm.sh执行如下命令 source ~/.zshrc1.2 安装 node nvm install nodenvm ls -> …

1260. 二维网格迁移

1260. 二维网格迁移 原题链接&#xff1a;完成情况&#xff1a;解题思路&#xff1a;参考代码&#xff1a;错误经验吸取 原题链接&#xff1a; 1260. 二维网格迁移 https://leetcode.cn/problems/shift-2d-grid/description/ 完成情况&#xff1a; 解题思路&#xff1a; 这…

android不同版本(支持>10)获取当前连接的wifi名称

1、AndroidManifest.xml 配置权限 <uses-permission android:name"android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name"android.permission.CHANGE_NETWORK_STATE" /> <uses-permission android:name&q…

磁盘管理和文件系统

一.磁盘基础 1.磁盘结构 &#xff08;1&#xff09;物理结构&#xff1a; 盘片&#xff1a;硬盘有多个盘片&#xff0c;每盘片2面 磁头&#xff1a;每面一个磁头 &#xff08;2&#xff09;硬盘的数据结构 扇区&#xff1a;盘片被分为多个扇形区域&#xff0c;每个扇区存…

山姆·奥特曼是如何成为亿万富豪的?

2017年夏天&#xff0c;Superhuman公司首席执行官拉胡尔沃拉&#xff08;Rahul Vohra&#xff09;开始疯狂向投资者一一发消息&#xff0c;缘由是他的初创公司尝试了谷歌浏览器Chrome的一项即将推出的更新。由于一个看似无害的代码更改&#xff0c;Superhuman的智能电子邮件服务…

Jackson 2.x 系列【23】注解内省 AnnotationIntrospector

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Jackson 版本 2.17.0 源码地址&#xff1a;https://gitee.com/pearl-organization/study-jaskson-demo 文章目录 1. 前言2. AnnotationIntrospector3. JacksonAnnotationIntrospector4. Annotati…

SQL12 获取每个部门中当前员工薪水最高的相关信息

题目&#xff1a;获取每个部门中当前员工薪水最高的相关信息 注意了&#xff0c;这道题目&#xff0c;分组函数只能查出来&#xff1a;每个部门的最高薪水&#xff0c;group by dept_no &#xff0c;根据部门分组&#xff0c;绝对不能group by dept_no,emp_no&#xff0c;不能…

【刷题笔记】第二天

一道图论相关的题目 3108. 带权图里旅途的最小代价 结论&#xff1a; 做与运算&#xff0c;结果不会大于当前值&#xff0c;也就是说与运算只能导致结果不变或越来越小&#xff0c;所以要使得边的and值最小&#xff0c;就是把每一个联通块的所有边都and一遍。 方法1&#xf…

Vue项目实战:基于用户身份的动态路由管理

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…

201403-3 命令行选项

100分 #include <bits/stdc.h> using namespace std;int main() {string line;cin >> line;map<char, bool> dct; // true:带参数 false:不带参数for (int i 0; i < line.size(); i){if (line[i] ! :){dct.insert(pair<char, bool>(line[i], fals…

ubuntu 23.10.1 mysql 安装

注&#xff1a;请进入root用户模式下操作&#xff0c;若没有&#xff0c;输入命令前加上sudo 1、更新软件包列表 apt update2、安装最新版的Mysql服务器 apt install mysql-server -y如果不加-y 会在安装过程中&#xff0c;系统将提示你设置MySQL的root密码。确保密码足够强…

职场成长之路:如何规划与实现

在职场中&#xff0c;每个人都希望实现自己的职业目标和成长。然而&#xff0c;职场成长并非一蹴而就&#xff0c;需要有明确的规划和方法。本文将探讨如何在职场中规划与实现成长&#xff0c;帮助您迈向成功之路。 一、明确职业目标 1. 自我认知&#xff1a;了解自己的兴趣、…

C语言双向链表

1. 链表的分类 链表的种类很多&#xff0c;主要由三个要素决定&#xff1a;是否带头&#xff0c;单向还是双向&#xff0c;是否循环。 根据这三个要素的组合&#xff0c;共可得到8&#xff08;2*2*2&#xff09;种链表 而我们常用的链表有两种&#xff1a; 1. 单链表&#xf…

鸿蒙原生应用元服务-访问控制(权限)开发Stage模型向用户申请授权

一、向用户申请授权 当应用需要访问用户的隐私信息或使用系统能力时&#xff0c;例如获取位置信息、访问日历、使用相机拍摄照片或录制视频等&#xff0c;应该向用户请求授权。这需要使用 user_grant 类型权限。在此之前&#xff0c;应用需要进行权限校验&#xff0c;以判断当前…

02_按键控制LED

按键控制LED 按键控制LED 按键控制LED while (1){//按键控制LEDif(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_5)GPIO_PIN_RESET)//读取PC5引脚状态&#xff0c;即检测按键是否按下{while(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_5)GPIO_PIN_RESET);//松手检测HAL_GPIO_WritePin(GPIOA,GPIO_PI…

【JavaWeb】Day45.Mybatis——入门程序

什么是MyBatis? MyBatis是一款优秀的持久层框架&#xff0c;用于简化JDBC的开发。 &#xff08;持久层&#xff1a;指的是就是数据访问层(dao)&#xff0c;是用来操作数据库的。&#xff09; &#xff08;框架&#xff1a;是一个半成品软件&#xff0c;是一套可重用的、通用…

【软考】UML中的图之类图

目录 1. 说明2. 图示3. 类图使用方式3.1 对系统的词汇建模3.2 对简单的协作建模3.3 对逻辑数据库模式建模 1. 说明 1.类图&#xff08;Class Diagram&#xff09;展现了一组对象、接口、协作和它们之间的关系。2.在面向对象系统的建模中所建立的最常见的图是类图。3.类图给出系…

Openwrt21.02支持SKW78(MT7621)

1.获取SDK 1.下载Openwrt源码 下载链接&#xff1a; git clone --branch openwrt-21.02 https://gitee.com/cocos_yang/openwrt.git 下载完后&#xff0c;会有一个openwrt目录&#xff0c;进入openwrt目录 cd openwrt 修改feeds.conf.default的内容&#xff0c;如下所示&#x…

操作系统(1)计算机存储结构

文章目录 一、计算机存储结构1、基本概念2、计算机存储结构的组成部分3、局部性原理4、高速缓存4.1、基本概念4.2、工作原理4.3、层次结构4.4、对系统性能的影响4.5、一致性问题 5、寄存器5.1&#xff0c;种类5.2&#xff0c;特点5.3、作用5.4、寄存器与缓存的差异 前言 计算机…