CF1228——记一次和紫名失之交臂的CF

第无数次和暴涨失之交臂

A

题目大意给定\(l,r\)输出任意一个\(l,r\)之间的每一位都不同的数

\((l <= r <= 10^5)\)

O(nlogn)暴力判断即可

其实也可以暴力枚举所有全排列

我这里选择了较为简单的暴力写法

#include<cstdio>
#include<iostream>
#include<queue>
#include<algorithm>
#include<cstring>
#include<cctype>
#include<vector>
#include<ctime>
#define LL long long
#define pii pair<int,int>
#define mk make_pair
#define fi first
#define se second
using namespace std;
inline int read(){
int v = 0,c = 1;char ch = getchar();
while(!isdigit(ch)){
if(ch == '-') c = -1;
ch = getchar();
}
while(isdigit(ch)){
v = v * 10 + ch - 48;
ch = getchar();
}
return v * c;
}
bool book[13];
inline bool check(int x){
memset(book,0,sizeof(book));
while(x){
if(book[x % 10]) return 0;
book[x % 10] = 1;
x /= 10;
}
return 1;
}
int main(){
int l = read(),r = read();
for(int i = l;i <= r;++i){
if(check(i)) return printf("%d\n",i) * 0;
}
puts("-1");
return 0;
}
 

B

题目不太好复述

我们想每一个限制实质上是强制确定了前\(x\)个位置的颜色

如果没出现冲突

设有\(res\)个位置没有被确定

那么这些位置是可黑可白的

答案就是\(2^{res}\),出现冲突就是\(0\)

#include<cstdio>
#include<iostream>
#include<queue>
#include<algorithm>
#include<cstring>
#include<cctype>
#include<vector>
#include<ctime>
#define LL long long
#define pii pair<int,int>
#define mk make_pair
#define fi first
#define se second
using namespace std;
const int N = 2e6 + 3;
const LL mod = 1e9 + 7;
inline int read(){
int v = 0,c = 1;char ch = getchar();
while(!isdigit(ch)){
if(ch == '-') c = -1;
ch = getchar();
}
while(isdigit(ch)){
v = v * 10 + ch - 48;
ch = getchar();
}
return v * c;
}
LL p[N];
int r[N],c[N];
int n,m;
int ans[2005][2005];
int main(){
bool flag = 0;
memset(ans,-1,sizeof(ans));
p[0] = 1;
for(int i = 1;i <= 1500000;++i) p[i] = p[i - 1] * 2 % mod;
n = read(),m = read();
for(int i = 1;i <= n;++i){
int x = read();
for(int j = 1;j <= x;++j){
if(ans[i][j] == 0) flag = 1;
ans[i][j] = 1;
}
x++;
if(ans[i][x] == 1) flag = 1;
ans[i][x] = 0;
}
for(int i = 1;i <= m;++i){
int x = read();
for(int j = 1;j <= x;++j){
if(ans[j][i] == 0) flag = 1;
ans[j][i] = 1;
}
x++;
if(ans[x][i] == 1) flag = 1;
ans[x][i] = 0;
}
if(flag){
printf("0\n");
return 0;
}
int tot = 0;
for(int i = 1;i <= n;++i){
for(int j = 1;j <= m;++j)
tot += (ans[i][j] == -1);
}
printf("%lld\n",p[tot]);
return 0;
}

C

题目定义了1长串的式子

就是为了告诉你给定\(m,x\)

求\(1-m\)中所有\(p\),\(p^2\),\(\dots\),\(p^{\infty}\)\((p|x,p\in prime)\)的乘积

这个

我们考虑先算\(p^1\)的贡献,再算\(p^2\)的贡献

\[ans = \prod_{i = 1}^{\infty} p^\frac{m}{p^i} (p\in prime ,p | x)
\]

我们只需要对\(x\)质因数分解,然后对于每个质因子求一下上面的式子的贡献

时间复杂度\(\sqrt{x}log(n)\)

#include<cstdio>
#include<iostream>
#include<queue>
#include<algorithm>
#include<cstring>
#include<cctype>
#include<vector>
#include<ctime>
#define LL unsigned long long
#define pii pair<int,int>
#define mk make_pair
#define fi first
#define se second
using namespace std;
const LL mod = 1e9 + 7;
int tot = 0;
LL p[1000005];
inline LL read(){
LL v = 0,c = 1;char ch = getchar();
while(!isdigit(ch)){
if(ch == '-') c = -1;
ch = getchar();
}
while(isdigit(ch)){
v = v * 10 + ch - 48;
ch = getchar();
}
return v * c;
}
inline void work(LL x){
LL rr = x;
for(int i = 2;1ll * i * i <= x;++i){
if(rr % i == 0){
p[++tot] = i;
while(rr % i == 0) rr /= i;
}
if(rr == 1) break;
}
if(rr != 1) p[++tot] = rr;
}
LL n,m;
inline LL quick(LL x,LL y){
LL res = 1;
while(y){
if(y & 1) res = res * x % mod;
x = x * x % mod;
y >>= 1;
}
return res;
}
int main(){
n = read(),m = read();
work(n);
LL ans = 1;
for(int i = 1;i <= tot;++i){
LL res = p[i];
LL rest = m;
while(rest != 0){
ans = ans * quick(p[i],(rest / res)) % mod;
rest /= res;
}
}
printf("%lld\n",ans);
return 0;
}

D

题目大意

给定一个\(n\)个点,\(m\)条边的图,把\(n\)个点分成三个集合,使得两两集合为完全二分图

一种情况每判就GG了

首先我们发现一个点和他没有边的点必须在同一集合

而且我们最多找三次没有所属集合的点(因为题目要求就是选择三个集合)

那么我们枚举一个点

之后强制和他没有直接相连的点和他在同一集合如果这个点已经在别的集合,很明显无解

最后我们一定会得到三个集合

但是我们没法保证正确性

我们再尝试一一判断所有情况

\(1\)任一点都必须且只能属于一个集合

\(2\)同一集合内部不能有边

\(3\)两两集合是完全二分图

只有满足上述条件才是一组合法解

\(2\)我们可以通过枚举每一条边来实现

\(3\)我们可以通过记录一下每个点的度数,看看他是否等于另外两个集合的大小即可

#include<cstdio>
#include<iostream>
#include<queue>
#include<algorithm>
#include<cstring>
#include<cctype>
#include<vector>
#include<ctime>
#include<set>
#define LL long long
#define pii pair<int,int>
#define mk make_pair
#define fi first
#define se second
using namespace std;
const int N = 1e6 + 3;
vector<int>G[N];
vector<int>gg[5];
int n,m,size,sz1,sz2,sz3;
int ans[N],d[N];
int cc[N];
set <int> s[N];
int vis[N];
bool flag = 1;
inline int read(){
int v = 0,c = 1;char ch = getchar();
while(!isdigit(ch)){
if(ch == '-') c = -1;
ch = getchar();
}
while(isdigit(ch)){
v = v * 10 + ch - 48;
ch = getchar();
}
return v * c;
}
inline void dfs(int x){
size++;
vis[x] = 1;
for(int i = 0;i < (int)G[x].size();++i){
int y = G[x][i];
if(vis[y]) continue;
dfs(y);
}
}
int main(){
n = read(),m = read();
for(int i = 1;i <= m;++i){
int x = read(),y = read();
G[x].push_back(y);
G[y].push_back(x);
d[x]++,d[y]++;
}
memset(vis,0,sizeof(vis));
for(int i = 0;i < (int)G[1].size();++i){
int y = G[1][i];
vis[y] = 1;
}
for(int i = 1;i <= n;++i) if(!vis[i]) ans[i] = 1,sz1++; int now = 2;
while(now <= n && ans[now] == 1)now++;
if(now > n){
printf("-1\n");
return 0;
}
memset(vis,0,sizeof(vis));
for(int i = 0;i < (int)G[now].size();++i){
int y = G[now][i];
if(ans[y] == 2) flag = 0;
vis[y] = 1;
}
for(int i = 1;i <= n;++i){
if(!vis[i]){
if(ans[i] == 1) flag = 0;
ans[i] = 2;
sz2++;
}
}
now++; while(now <= n && (ans[now] == 1 || ans[now] == 2))now++;
if(now > n){
printf("-1\n");
return 0;
}
memset(vis,0,sizeof(vis));
for(int i = 0;i < (int)G[now].size();++i){
int y = G[now][i];
if(ans[y] == 3) flag = 0;
vis[y] = 1;
}
for(int i = 1;i <= n;++i){
if(!vis[i]){
if(ans[i] == 1 || ans[i] == 2) flag = 0;
else ans[i] = 3;
sz3++;
}
}//for(int i = 1;i <= n;++i) printf("%d ",ans[i]);puts("");
now++;
while(now <= n && (ans[now] == 1 || ans[now] == 2 || ans[now] == 3))now++;
if(now <= n) flag = 0;
for(int i = 1;i <= n;++i){
for(int j = 0;j < (int)G[i].size();++j){
int y = G[i][j];
if(ans[i] == ans[y]) flag = 0;
}
if(ans[i] == 1 && d[i] != sz2 + sz3) flag = 0;
if(ans[i] == 2 && d[i] != sz1 + sz3) flag = 0;
if(ans[i] == 3 && d[i] != sz1 + sz2) flag = 0;
}
if(flag == 0) printf("-1");
else for(int i = 1;i <= n;++i) printf("%d ",ans[i]);
return 0;
}
 

E

艹,没读E题,结果是个ZZ题

题目大意;给定一个\(n\times n\)的矩阵,每个位置可以填\(1-k\),问有多少种填法使得每一行每一列最小值都是\(1\)

\(n\le 250,k\le10^9\)

首先,考虑容斥,我们强制某些行某些列不能为1,其他随便填

容斥式子

\[ans = \sum_{i = 0}^n\sum_{j = 1}^m (-1)^{i + j}\left(\begin{array}{l}{n} \\ {i}\end{array}\right)\left(\begin{array}{l}{n} \\ {j}\end{array}\right)(k - 1)^{(i + j)\times n-i\times j} k^{n^2-(i+j)\times n+i\times j}
\]

就是强制的位置不能出现\(1\)其他位置随便选

唯一不懂的地方是\((-1)^{i + j}\)

\(update\)

因为行和列在容斥中式独立的

所以\((-1)^{i + j }\)本质是\((-1 )^i \times (-1) ^ j\)

所以多维容斥本质也是每一维度互相独立然后总和算贡献

#include<cstdio>
#include<iostream>
#include<queue>
#include<algorithm>
#include<cstring>
#include<cctype>
#include<vector>
#include<ctime>
#define LL long long
#define pii pair<int,int>
#define mk make_pair
#define fi first
#define se second
using namespace std;
const int N = 505;
const LL mod = 1e9 + 7;
LL C[N][N];
inline int read(){
int v = 0,c = 1;char ch = getchar();
while(!isdigit(ch)){
if(ch == '-') c = -1;
ch = getchar();
}
while(isdigit(ch)){
v = v * 10 + ch - 48;
ch = getchar();
}
return v * c;
}
inline LL quick(LL x,LL y){
LL res = 1;
while(y){
if(y & 1) res = res * x % mod;
x = x * x % mod;
y >>= 1;
}
return res;
}
int n,k;
int main(){
C[0][0] = 1;
for(int i = 1;i <= 500;++i){
C[i][0] = 1;
for(int j = 1;j <= i;++j)
C[i][j] = (C[i - 1][j - 1] + C[i - 1][j]) % mod;
}
n = read(),k = read();
LL ans = 0;
for(int i = 0;i <= n;++i){
for(int j = 0;j <= n;++j){
LL res = C[n][i] * C[n][j] % mod * quick(k - 1,(i + j) * n - i * j) % mod
* quick(k,n * n - ((i + j) * n - i * j)) % mod;
// printf("%d %d %lld\n",i,j,res);
if((i + j) & 1) ans = ans - res;
else ans = ans + res;
if(ans >= mod) ans -= mod;
if(ans < 0) ans += mod;
}
}
printf("%lld\n",ans);
return 0;
}
 
 

CF1228——记一次和紫名失之交臂的CF的更多相关文章

  1. 【codeforces】【比赛题解】#915 Educational CF Round 36

    虽然最近打了很多场CF,也涨了很多分,但是好久没写CF的题解了. 前几次刚刚紫名的CF,太伤感情了,一下子就掉下来了,不懂你们Div.1. 珂学的那场我只做了第一题……悲伤. 这次的Education ...

  2. 学习linux内核时常碰到的汇编指令(1)

     转载:http://blog.sina.com.cn/s/blog_4be6adec01007xvg.html 80X86 汇编指令符号大全 +.-.*./∶算术运算符. &∶宏处理操作符. ...

  3. CF Educational Codeforces Round 57划水记

    因为是unrated于是就叫划水记了,而且本场也就用了1h左右. A.B:划水去了,没做 C:大水题,根据初三课本中圆的知识,可以把角度化成弧长,而这是正多边形,所以又可以化成边数,于是假设读入为a, ...

  4. cf掉分记——Avito Code Challenge 2018

    再次作死的打了一次cf的修仙比赛感觉有点迷.. 还好掉的分不多(原本就太低没法掉了QAQ) 把会做的前三道水题记录在这.. A: Antipalindrome emmmm...直接暴力枚举 code: ...

  5. 记人生中第一场认真打的CF——CF1000(虽然是Virtual participation)

    老师说下午要让我们(来自开明的新高一同学)感受一下CF,于是下午2:20我们就集中到了机房.老师教我们用Educational Codeforces Round 46 (Rated for Div. ...

  6. 记第一场cf比赛(Codeforces915)

    比赛感想 本来21:05开始的比赛,结果记成21:30了...晚了25分钟才开始[捂脸] 这次是Educational Round,所以还比较简单. 前两道题一眼看去模拟+贪心,怕错仔细看了好几遍题, ...

  7. [CF]codeforces round#366(div2)滚粗记

    开场心理活动:啊打完这场大概有1700了吧 中途心理活动:啊这个ABC看起来都随便做啊 死亡原因:欸怎么没网了 -75 .. A [题意]Hulk说完一句I hate会说that I love 然后是 ...

  8. THUWC2018滚粗记

    THUWC2018滚粗记 前言 又是一篇滚粗记, 不过可能还要写过很多很多篇滚粗记, 才会有一篇不是滚粗记的东西啦 总而言之,我现在还是太菜了 还要过一大段时间我才会变强啦 Day -inf 联赛考完 ...

  9. [Recommendation System] 推荐系统之协同过滤(CF)算法详解和实现

    1 集体智慧和协同过滤 1.1 什么是集体智慧(社会计算)? 集体智慧 (Collective Intelligence) 并不是 Web2.0 时代特有的,只是在 Web2.0 时代,大家在 Web ...

随机推荐

  1. oracle-Mount

    执行nomount的所有工作,另外附加数据结构并与这些数据结构进行交互.这时,oracle从控制文件中获得信息. 可以执行的任务是: 执行数据库的完全恢复操作 重命名数据文件 改变数据库的归档状态. ...

  2. 用var 变量=函数名 方式调用函数时如何传值的问题

    通过:xmlhttp.onreadystatechange= function(){FuncName(param)};orxmlhttp.onreadystatechange= new Functio ...

  3. OpenCV在各版本上的安装教程

    目录 使用pip安装OpenCV 安装Python版的OpenCV 4 安装Python版的OpenCV 3 在OSX和 macOS上安装OpenCV 3 在Ubuntu上安装Python版的Open ...

  4. 在 Linux Mint 19 上安装 zsh 和设置小键盘一步到位

    在 Linux Mint 19 上安装 zsh 和设置小键盘 安装 zsh 并设置 zsh 为默认 shell 安装 sudo apt install zsh 设置 zsh 为默认 shell,注意没 ...

  5. thinkphp5.0 路由规则配置

    开启路由‘url_route_on’ => true 首页路由'/' =>'home/index/index' 其它路由(1)'route' => 'home/index/route ...

  6. 【NS2】ns2 otcl与c++关联(转载)

    最近几天,对ns2进行研究,ns2为什么要使用两种语言,因为C++执行速度快,因此对于一些不需要经常改变的东西:例如包的发送.而对于需要经常进行修改的就不能够使用C++,而使用OTcl脚本语言.所有O ...

  7. windows dos命令下切换目录

    1.如果我们要访问F盘,只需要输入F: 2.如果我们要进入一个具体的文件夹,那么继续输入命令.比如我要进入pythoncoding这个文件夹,则输入 cd pythoncoding

  8. React 从零搭建项目 使用 create-react-app脚手架

    一.安装 npm install -g create-react-app 版本校验:create-react-app --version 二.创建项目 create-react-app指令默认调用np ...

  9. oracle函数 TO_MULTI_BYTE(c1)

    [功能]将字符串中的半角转化为全角 [参数]c1,字符型 [返回]字符串 [示例] SQL> select to_multi_byte('高A') text from dual; test -- ...

  10. shell爬虫

    #!/bin/bash curl_str='curl -x "http://http-pro.abuyun.com:9010" --proxy-basic --proxy-user ...