CF1228——记一次和紫名失之交臂的CF
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\)的贡献
\]
我们只需要对\(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,其他随便填
容斥式子
\]
就是强制的位置不能出现\(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的更多相关文章
- 【codeforces】【比赛题解】#915 Educational CF Round 36
虽然最近打了很多场CF,也涨了很多分,但是好久没写CF的题解了. 前几次刚刚紫名的CF,太伤感情了,一下子就掉下来了,不懂你们Div.1. 珂学的那场我只做了第一题……悲伤. 这次的Education ...
- 学习linux内核时常碰到的汇编指令(1)
转载:http://blog.sina.com.cn/s/blog_4be6adec01007xvg.html 80X86 汇编指令符号大全 +.-.*./∶算术运算符. &∶宏处理操作符. ...
- CF Educational Codeforces Round 57划水记
因为是unrated于是就叫划水记了,而且本场也就用了1h左右. A.B:划水去了,没做 C:大水题,根据初三课本中圆的知识,可以把角度化成弧长,而这是正多边形,所以又可以化成边数,于是假设读入为a, ...
- cf掉分记——Avito Code Challenge 2018
再次作死的打了一次cf的修仙比赛感觉有点迷.. 还好掉的分不多(原本就太低没法掉了QAQ) 把会做的前三道水题记录在这.. A: Antipalindrome emmmm...直接暴力枚举 code: ...
- 记人生中第一场认真打的CF——CF1000(虽然是Virtual participation)
老师说下午要让我们(来自开明的新高一同学)感受一下CF,于是下午2:20我们就集中到了机房.老师教我们用Educational Codeforces Round 46 (Rated for Div. ...
- 记第一场cf比赛(Codeforces915)
比赛感想 本来21:05开始的比赛,结果记成21:30了...晚了25分钟才开始[捂脸] 这次是Educational Round,所以还比较简单. 前两道题一眼看去模拟+贪心,怕错仔细看了好几遍题, ...
- [CF]codeforces round#366(div2)滚粗记
开场心理活动:啊打完这场大概有1700了吧 中途心理活动:啊这个ABC看起来都随便做啊 死亡原因:欸怎么没网了 -75 .. A [题意]Hulk说完一句I hate会说that I love 然后是 ...
- THUWC2018滚粗记
THUWC2018滚粗记 前言 又是一篇滚粗记, 不过可能还要写过很多很多篇滚粗记, 才会有一篇不是滚粗记的东西啦 总而言之,我现在还是太菜了 还要过一大段时间我才会变强啦 Day -inf 联赛考完 ...
- [Recommendation System] 推荐系统之协同过滤(CF)算法详解和实现
1 集体智慧和协同过滤 1.1 什么是集体智慧(社会计算)? 集体智慧 (Collective Intelligence) 并不是 Web2.0 时代特有的,只是在 Web2.0 时代,大家在 Web ...
随机推荐
- Directx11教程(4) 一个最基本D3D应用程序(2)
原文:Directx11教程(4) 一个最基本D3D应用程序(2) 接着上篇教程的代码,本篇加入基本的D3D代码,实现一个完整的D3D11程序框架. 我们增加一个新类D3DClass, 用来处理3D渲 ...
- QT QSettings读写配置文件
QT QSettings读写配置文件 需要用一个配置文件来保存程序的初始值,同时也需要做保存修改后的值. 那么借助于QSetting 就可以达到目的. 注意,生成的是 ini 文件! //1.创建和读 ...
- js不停地触发按钮的事件
例子:不断地发匿名邮件 http://tool.chacuo.net/mailsend 在控制台写:setInterval('$(".convert :input[arg]").t ...
- jmeter进行的接口测试和压力测试
1.接口测试 接口测试的内容我们之前已经讲过,values-key形式和json串传参形式: 包括的协议有http,webservice(soap),jdbc数据库,java请求 2.参数化 定义:把 ...
- 寒哥教你学iOS - 经验漫谈
http://www.jianshu.com/p/cb54054d3add 寒哥教你学iOS - 经验漫谈 字数2848 阅读1896 评论19 喜欢43 顺便来个广告 iOS开发者 群1734993 ...
- 《js高级程序设计》6.1.1-6.1.3——数据属性、访问器属性
数据属性:该属性包含了一个数据值的位置,它包含了4个描述行为的特性:1. [[Configurable]]:表示是否能通过delete删除属性从而重新定义属性,能否修改属性的特性,能否把属性修改为访问 ...
- Hadoop入门进阶步步高(三)-配置Hadoop
三.配置Hadoop 1.设置$HADOOP_HOME/conf/hadoop-env.sh 这个文件里设置的是Hadoop运行时须要的环境变量,在1.2.1版中共同拥有19个环境变量.例如以下: ...
- Oracle中的Union、Union All、Intersect、Minus[转]
众所周知的几个结果集集合操作命令,今天详细地测试了一下,发现一些问题,记录备考. 假设我们有一个表Student,包括以下字段与数据: drop table student; create table ...
- C++ 输出到文本文件
输出到文本文件 就像从文件输入数据一样,你也可以将数据输出到文件.假设你有一个矩阵,你想把结果保存到一个文本文件中.你会看到,将矩阵输出到文件的代码和将矩阵输出到终端的代码非常相似. 你需要在本地运行 ...
- day6_python之json序列化和反序列化
json作用:用来保存当前状态 1.使用json.dumps序列化把dic字典存到文件中 dic={'name':'egon','age':18} print(json.dumps(dic)) #得到 ...