Codeforces Round #440 Div. 1
A:显然应该尽量拆成4。如果是奇数,先拆一个9出来即可。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
#define N 100010
char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')&&(c<'0'||c>'9')) c=getchar();return c;}
int gcd(int n,int m){return m==0?n:gcd(m,n%m);}
int read()
{
int x=0,f=1;char c=getchar();
while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}
while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
return x*f;
}
int q,n;
signed main()
{
#ifndef ONLINE_JUDGE
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
#endif
q=read();
while (q--)
{
n=read();int ans=0;
if (n<4) {cout<<-1<<endl;continue;}
if (n&1)
{
if (n<9) {cout<<-1<<endl;continue;}
n-=9;ans++;
if (n==2) {cout<<-1<<endl;continue;}
}
ans+=n/4;
printf("%d\n",ans);
}
return 0;
//NOTICE LONG LONG!!!!!
}
B:注意到由异或的消去性,事实上可以通过2n次询问得到所有n2种询问的结果。然后若第一个数确定,整个排列就确定了,暴力枚举即可。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
#define N 10010
char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')&&(c<'0'||c>'9')) c=getchar();return c;}
int gcd(int n,int m){return m==0?n:gcd(m,n%m);}
int read()
{
int x=0,f=1;char c=getchar();
while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}
while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
return x*f;
}
int n,a[N],b[N],c[N],d[N];
signed main()
{
n=read();
int u;
for (int i=0;i<n;i++)
{
cout<<'?'<<' '<<0<<' '<<i<<endl;
cin>>c[i];
if (c[i]==0) u=i;
}
for (int i=0;i<n;i++)
{
cout<<'?'<<' '<<i<<' '<<u<<endl;
cin>>a[i];
}
cout<<"!"<<endl;int ans=0;
for (int i=0;i<n;i++)
{
for (int j=0;j<n;j++) d[j]=i^c[j];
bool flag=0;
for (int j=0;j<n;j++)
{
b[j]=i^a[j];
if (b[j]==u&&i!=j) {flag=1;break;}
}
for (int j=0;j<n;j++) if (b[d[j]]!=j) {flag=1;break;}
if (!flag)
{
sort(b,b+n);
for (int j=0;j<n;j++) if (b[j]!=j) {flag=1;break;}
if (!flag) ans++;
}
}
cout<<ans<<endl;
for (int i=0;i<n;i++)
{
for (int j=0;j<n;j++) d[j]=i^c[j];
bool flag=0;
for (int j=0;j<n;j++)
{
b[j]=i^a[j];
if (b[j]==u&&i!=j) {flag=1;break;}
}
for (int j=0;j<n;j++) if (b[d[j]]!=j) {flag=1;break;}
if (!flag)
{
for (int j=0;j<n;j++) cout<<(i^a[j])<<' ';return 0;
}
}
return 0;
//NOTICE LONG LONG!!!!!
}
C:同行同列相邻点连边,对每个连通块分别考虑。如果连通块构成一棵树,显然只要不选择所有直线,每种方案都能被构造出来。如果有环,考虑环上所有直线都可以被选中,而增加一个点和其相连至多会增加一条未选中直线,令该点选择该直线即可,所以所有直线都能同时被选中,所以方案都能被构造出来。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<map>
#include<cassert>
using namespace std;
#define ll long long
#define N 100010
#define P 1000000007
char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')&&(c<'0'||c>'9')) c=getchar();return c;}
int gcd(int n,int m){return m==0?n:gcd(m,n%m);}
int read()
{
int x=0,f=1;char c=getchar();
while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}
while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
return x*f;
}
int n,ans=1,p[N],X[N],Y[N],t,u,v;
map<int,int> row,line;
bool flag[N];
struct data2{int to,nxt;
}edge[N<<4];
struct data
{
int i,x,y;
bool operator <(const data&a) const
{
return x<a.x;
}
}a[N];
bool cmp1(const data&a,const data&b)
{
return a.x<b.x;
}
void addedge(int x,int y)
{
t++;edge[t].to=y,edge[t].nxt=p[x],p[x]=t;
}
int ksm(int a,int k)
{
int s=1;
for (;k;k>>=1,a=1ll*a*a%P) if (k&1) s=1ll*s*a%P;
return s;
}
void dfs(int k,int from)
{
flag[k]=1;
if (row.find(X[k])==row.end()) row[X[k]]=1,u++;
if (line.find(Y[k])==line.end()) line[Y[k]]=1,u++;
for (int i=p[k];i;i=edge[i].nxt)
if (edge[i].to!=from)
if (flag[edge[i].to]) v=0;
else dfs(edge[i].to,k);
}
signed main()
{
#ifndef ONLINE_JUDGE
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
#endif
n=read();
for (int i=1;i<=n;i++) X[i]=a[i].x=read(),Y[i]=a[i].y=read(),a[i].i=i;
sort(a+1,a+n+1);
for (int i=1;i<=n;i++)
{
int t=i;
while (t<n&&a[t+1].x==a[i].x) t++;
for (int j=i;j<t;j++) addedge(a[j].i,a[j+1].i),addedge(a[j+1].i,a[j].i);
i=t;
}
for (int i=1;i<=n;i++) swap(a[i].x,a[i].y);
sort(a+1,a+n+1);
for (int i=1;i<=n;i++)
{
int t=i;
while (t<n&&a[t+1].x==a[i].x) t++;
for (int j=i;j<t;j++) addedge(a[j].i,a[j+1].i),addedge(a[j+1].i,a[j].i);
i=t;
}
for (int i=1;i<=n;i++)
if (!flag[i])
{
row.clear();line.clear();
u=0;v=1;dfs(i,i);
ans=1ll*ans*(ksm(2,u)-v)%P;
}
cout<<ans;
return 0;
//NOTICE LONG LONG!!!!!
}
D:若两数互质,考虑其最小质因子,若其乘积<=n则显然两数距离为2,否则注意到可以通过2*质因子来过渡,所以只要两个数都不是>=n/2的质数或1距离就为3,否则为0。大力容斥大讨论即可。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
#define N 10000010
char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')&&(c<'0'||c>'9')) c=getchar();return c;}
int gcd(int n,int m){return m==0?n:gcd(m,n%m);}
int read()
{
int x=0,f=1;char c=getchar();
while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}
while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
return x*f;
}
int n,prime[N],phi[N],p[N],v[N],cnt;
ll ans;
bool flag[N],f[N];
signed main()
{
#ifndef ONLINE_JUDGE
freopen("d.in","r",stdin);
freopen("d.out","w",stdout);
#endif
n=read();
flag[1]=1;phi[1]=1;
for (int i=2;i<=n;i++)
{
if (!flag[i]) prime[++cnt]=i,phi[i]=i-1,p[i]=i,v[i]=-1;
for (int j=1;j<=cnt&&prime[j]*i<=n;j++)
{
flag[prime[j]*i]=1;
p[prime[j]*i]=prime[j];
if (i%prime[j]==0) {phi[prime[j]*i]=phi[i]*prime[j];break;}
phi[prime[j]*i]=phi[i]*(prime[j]-1);
}
}
ll tot=0;
for (int i=2;i<=n;i++) tot+=phi[i],v[p[i]]++;
ans+=1ll*n*(n-1)/2-tot; //dis=1
int u=1;for (int i=1;i<=cnt;i++) if (prime[i]>n/2) u++;
tot-=1ll*u*(n-1);tot+=1ll*u*(u-1)/2; //dis=0 tot=dis2+dis3
ans+=tot*3;
/*for (int i=2;i<=n;i++)
for (int j=2;j<i;j++)
if (gcd(i,j)==1&&1ll*p[i]*p[j]<=n) ans--;
cout<<ans;return 0;*/
for (int i=1;i<=cnt;i++)
if (prime[i]<=n/2)
{
for (int j=1;j<i;j++)
if (prime[i]*prime[j]<=n) ans--;
else break;
for (int j=1;j<=cnt;j++)
if (prime[j]<=n/prime[i]) ans-=v[prime[j]];
else break;
for (int j=prime[i]*2;j<=n;j+=prime[i])
if (p[j]<=n/prime[i]) ans++;
}
else break;
u=0;
for (int i=2;i<=n;i++)
if (flag[i])
{
ans-=i-2;
ans+=i-1-phi[i];
ans+=u;
int v=i;while (v>1) ans-=!f[p[v]],f[p[v]]=1,v/=p[v];
v=i;while (v>1) f[p[v]]=0,v/=p[v];
}
else u++;
cout<<ans;
return 0;
//NOTICE LONG LONG!!!!!
}
Codeforces Round #440 Div. 1的更多相关文章
- Codeforces Round #440 (Div. 2)【A、B、C、E】
Codeforces Round #440 (Div. 2) codeforces 870 A. Search for Pretty Integers(水题) 题意:给两个数组,求一个最小的数包含两个 ...
- Codeforces Round #440 (Div. 2, based on Technocup 2018 Elimination Round 2)
A. Search for Pretty Integers 题目链接:http://codeforces.com/contest/872/problem/A 题目意思:题目很简单,找到一个数,组成这个 ...
- Codeforces Round #440 (Div. 2, based on Technocup 2018 Elimination Round 2) D. Something with XOR Queries
地址:http://codeforces.com/contest/872/problem/D 题目: D. Something with XOR Queries time limit per test ...
- [日常] Codeforces Round #440 Div.2 大力翻车实况
上次打了一发ABC然后大力翻车...上午考试又停电+Unrated令人非常滑稽...下午终于到了CF比赛... 赛前大力安利了一发然后拉了老白/ $ljm$ / $wcx$ 一起打, 然后搞了个 TI ...
- Codeforces Round #440 (Div. 2) A,B,C
A. Search for Pretty Integers time limit per test 1 second memory limit per test 256 megabytes input ...
- Codeforces Round #440 (Div. 1, based on Technocup 2018 Elimination Round 2) C - Points, Lines and Ready-made Titles
C - Points, Lines and Ready-made Titles 把行列看成是图上的点, 一个点(x, y)就相当于x行 向 y列建立一条边, 我们能得出如果一个联通块是一棵树方案数是2 ...
- Codeforces Round #440 (Div. 2, based on Technocup 2018 Elimination Round 2) C. Maximum splitting
地址: 题目: C. Maximum splitting time limit per test 2 seconds memory limit per test 256 megabytes input ...
- ACM-ICPC (10/15) Codeforces Round #440 (Div. 2, based on Technocup 2018 Elimination Round 2)
A. Search for Pretty Integers You are given two lists of non-zero digits. Let's call an integer pret ...
- 【Codeforces Round #440 (Div. 2) C】 Maximum splitting
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 肯定用尽量多的4最好. 然后对4取模的结果 为0,1,2,3分类讨论即可 [代码] #include <bits/stdc++ ...
随机推荐
- Java消息中间件入门笔记 - ActiveMQ篇
入门 消息中间件带来的好处: 1)解耦:系统解耦 2)异步:异步执行 3)横向扩展 4)安全可靠 5)顺序保证 栗子: 通过服务调用让其它系统感知事件发生 系统之间高耦合 程序执行效率低 通过消息中间 ...
- 用Flask+Redis维护Cookies池
Redis数据库:存储微博账号密码 这里需要购买账号 登录后的cookies:键值对的形式保存 GitHub:https://github.com/LXL-YAN/CookiesPool 视频讲解:h ...
- plw的晚餐(毒瘤题害我暴0)
题意 描述 plw吃完午饭之后,马上又觉得肚子饿了.他决定马上从美食区离开,赶往下一个吃饭地点"香香鸡".但是在plw离开离开美食区之前,需要按美食区的规矩画一个特殊符号,并且如果 ...
- Python学习第十篇——函数初步
def make_album(name,album_name,song_nums = 1): dict_album = {name:[album_name]} if int(song_nums) &g ...
- iOS开发 横向分页样式 可左右滑动或点击头部栏按钮进行页面切换
iOS开发 横向分页样式 可左右滑动或点击头部栏按钮进行页面切换 不多说直接上效果图和代码 1.设置RootViewController为一个导航试图控制器 // Copyright © 2016年 ...
- Python_阻塞IO、非阻塞IO、IO多路复用
0.承上 进程: 计算机里最小的资源分配单位: 数据隔离, 利用多核,数据不安全. 线程: 计算机中最小的CPU调度单位: 数据共享,GIL锁,数据不安全. 协程: 线程的一部分,是有用户来调度的; ...
- [2017BUAA软工助教]个人项目测试结果
个人项目测试结果 标签(空格分隔): 未分类 9.29第一次测试结果 注:点击表头内相应项目可针对该项目进行排序 -c测试结果 INDEX NumberID -c 1 -c 5 -c 100 -c 5 ...
- 【学习总结】C-翁恺老师-入门-第4周<循环控制>
[学习总结]C-翁恺老师-入门-总 1-阶乘:引入for循环 2-控制循环次数:初始化与控制条件的设置 任何一个for循环都可以写成一个while循环 for中的每一个表达式都是可以省略的:for(; ...
- Linux的LiveCd与CD、DVD版
https://blog.csdn.net/sun_168/article/details/6744401
- java 工厂模式 转载
下面介绍三种设计模式,简单工厂模式,工厂方法模式,抽象工厂模式 思考如下场景: 有一天,林同学准备去买笔记本,他到商城发现有两款电脑他特别喜欢, 一款是 Macbook Pro, 另一款是 Surfa ...