某5道CF水题
1.PolandBall and Hypothesis
大意就是让你找一个m使得n*m+1是一个合数。
首先对于1和2可以特判,是1输出3,是2输出4。
然后对于其他所有的n,我们都可以非常快的找到一个最小的与它互质的质数p(考虑反证法),并且满足p<n。
这样就相当与解一个同余方程 n*m = p-1 (mod p) , 解出的m可以保证 n*m+1 是 p 的倍数,也就是合数了。
又因为gcd(p,n)==1,所以这个方程肯定有解,直接求一个 n 在mod p意义下的逆元然后乘上 p-1 就行了。
这个方法牛逼的地方就在它的复杂度(如果不算快速幂和n大了要用高精度的话)是比log还小的,所以n甚至可以出到 2^63 级别。
(但这样就不好写checker了吧2333)
#include<bits/stdc++.h>
#define ll long long
using namespace std; int zs[10]={2,3,5,7,11,13,17,19,23,29},n,i; inline int ksm(int x,int y,const int ha){
int an=1;
for(;y;y>>=1,x=x*(ll)x%ha) if(y&1) an=an*(ll)x%ha;
return an;
} int main(){
scanf("%d",&n);
if(n==1) puts("3");
else if(n==2) puts("4");
else for(;i<10;i++) if(n%zs[i]){
const int ha=zs[i];
printf("%d\n",(ha-1)*(ll)ksm(n%ha,ha-2,ha)%ha);
break;
}
return 0;
}
2.PolandBall and Game
很裸很裸的一个贪心,肯定是优先选重叠的,所以hash一下直接贪就好啦QWQ
#include<bits/stdc++.h>
#define ll unsigned long long
using namespace std; unordered_map<ll,int> mmp;
int n,m,tot;
ll now;
char c; int main(){
scanf("%d%d",&n,&m); for(int i=1;i<=n;i++){
for(c=getchar(),now=0;c!='\n';c=getchar()) now=now*(ll)73+c-'a'+3ll;
if(!now){ i--; continue;}
mmp[now]=1;
}
for(int i=1;i<=m;i++){
for(c=getchar(),now=0;c!='\n';c=getchar()) now=now*(ll)73+c-'a'+3ll;
if(!now){ i--; continue;}
if(mmp[now]) tot++;
} n+=(tot&1);
puts(n>m?"YES":"NO"); return 0;
}
3.PolandBall and Forest
又是一道神仙题。
可以证明同一颗树里面的p[]一定是点标号严格最小的直径中的一个端点,这个玩意还是画画图比较好理解。。。
于是我们就找一找这种端点互相对应的直径数就好啦。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=10005; int n,a[N],cnt; int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",a+i);
for(int i=1;i<=n;i++) if(a[i]>=i&&a[a[i]]==i) cnt++;
printf("%d\n",cnt);
return 0;
}
4.PolandBall and Gifts
把置换拆成环之后,可以发现一个位置不带礼物会影响环上它和它的后继,那么两种极值肯定是希望 影响尽量重叠 或者 尽量不重叠。
最小化的话就是尽量重叠,可以发现当且仅当物品看成是环大小的背包可以凑出k的时候答案是k;否则就是k+1。
直接背包肯定会凉凉啊,但是多重背包可以把每个物品的体积拆成 1 + 2 + 4 + ... + lef,偶数项都可以放到更大的体积的物品中去(因为 ∑每种物品的体积×个数 = N,所以不会出事),所以每种物品最多加两次,并且最多加sqrt(N)种不同的物品(想一想为什么),于是bitset一下复杂度刚刚好是 3*1e7,卡着过(虽然实际复杂度非常优秀)。
最大化非常简单,直接贪心就好啦QWQ
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1e6+5; inline int read(){
int x=0; char ch=getchar();
for(;!isdigit(ch);ch=getchar());
for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0';
return x;
} bitset<N> B;
int n,p[N],k,K,ans[2],lef,c[N];
bool v[N]; inline int getlen(int x){
int an=0;
for(;!v[x];x=p[x]) v[x]=1,an++;
return an;
} inline void solve0(){
for(int i=1,now;i<=n;i++) if(!v[i]){
now=getlen(i),c[now]++;
lef+=now&1,now^=now&1;
if(K>=(now>>1)) K-=now>>1,ans[0]+=now;
else if(K) ans[0]+=K<<1,K=0;
}
if(K) ans[0]+=min(K,lef);
} inline void solve1(){
B[0]=1;
for(int i=1;i<=n;i++) if(c[i]){
B|=B<<i,c[i]--;
if(c[i]&1) B|=B<<i;
c[i<<1]+=c[i]>>1;
}
ans[1]=B[k]?k:k+1;
} int main(){
n=read(),K=k=read();
for(int i=1;i<=n;i++) p[i]=read();
solve0(),solve1();
printf("%d %d\n",ans[1],ans[0]);
return 0;
}
5.Fix a Tree
首先原图肯定是若干基环树,我们的任务就是最后只留一个联通的基环树,并且环还得是自环。
先看一看原图中有没有自环,如果有的话就随便找一个当根。
然后用并查集维护联通性,如果i和p[i]已经在一个联通分量里的话,就把p[i]指向根,并且ans++。
当然,如果原来就没有根的话那么就把i设为根,最后答案是一样的。
可以证明答案总是 : 联通分量个数 - [原图中有没有自环]
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=200005; inline int read(){
int x=0; char ch=getchar();
for(;!isdigit(ch);ch=getchar());
for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0';
return x;
} void W(int x){ if(x>=10) W(x/10); putchar(x%10+'0');} int p[N],n,root,a[N],ans; int getf(int x){ return p[x]==x?x:(p[x]=getf(p[x]));} int main(){
n=read();
for(int i=1;i<=n;i++) p[i]=i,a[i]=read();
for(int i=1;i<=n;i++) if(a[i]==i){ root=i; break;} for(int i=1,fa,fb;i<=n;i++) if(i!=root){
fa=getf(i),fb=getf(a[i]);
if(fa!=fb) p[fa]=fb;
else{
ans++;
if(root) a[i]=root;
else root=a[i]=i;
}
} W(ans),puts("");
for(int i=1;i<=n;i++) W(a[i]),putchar(' ');
return 0;
}
某5道CF水题的更多相关文章
- 几道cf水题
题意:给你包含n个元素的数组和k种元素,要求k种元素要用完,并且每种颜色至少用一次,n个元素,如果某几个元素的值相同,这些个元素也不能染成同一种元素. 思路:如果元素个数n小于k或者值相同的元素的个数 ...
- 做了一道cf水题
被一道cf水题卡了半天的时间,主要原因时自己不熟悉c++stl库的函数,本来一个可以用库解决的问题,我用c语言模拟了那个函数半天,结果还超时了. 题意大概就是,给定n个数,查询k次,每次查询过后,输出 ...
- 一道cf水题再加两道紫薯题的感悟
. 遇到一个很大的数除以另一个数时,可以尝试把这个很大的数进行,素数因子分解. . 遇到多个数的乘积与另一个数的除法时,求是否能整除,可以先求每一个数与分母的最大公约数,最后若分母数字为1,则证明可整 ...
- 又一道简单题&&Ladygod(两道思维水题)
Ladygod Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Submit S ...
- 一道cf水题
题意:输入数字n表示字符串中元素个数,字符串中只含有RGB三个字符,现在要求任意两个相同的字符他们的下标之差能整除3. 思路:任意两个相同的字符的下标能整除3,也就是任意三个为一组的字符串当中的字符不 ...
- cf水题
题意:输入多组数据,有的数据代表硬币的长宽,有的数据代表钱包的长宽,问你当这组数据代表钱包的长宽时,能不能把它前面出现的所有硬币全部装下. 思路:只要钱包的长宽大于前面出现的所有硬币的长宽就可以装下, ...
- 在$CF$水题の记录
CF1158C CF1163E update after CF1173 很好,我!expert!掉rating了!! 成为pupil指日可待== 下次要记得合理安排时间== ps.一道题都没写的\(a ...
- 寒假第一发(CF水题两个)
地址http://codeforces.com/contest/799 A. Carrot Cakes In some game by Playrix it takes t minutes for a ...
- Cf水题B - Combination
地址: https://vjudge.net/problem/27861/origin Ilya plays a card game by the following rules. A player ...
随机推荐
- .NET FrameWork 中的 CTS
CTS:Common Type System 通用类型系统. 1.不仅可以把C#编译成.Net IL,还支持Basic.Python.Ruby等语言,甚至还支持Java.不同语言中的数据类型定义是不一 ...
- 牛客网刷题(纯java题型 1~30题)
牛客网刷题(纯java题型 1~30题) 应该是先extend,然后implement class test extends A implements B { public static void m ...
- 2017ACM暑期多校联合训练 - Team 1 1001 HDU 6033 Add More Zero (数学)
题目链接 Problem Description There is a youngster known for amateur propositions concerning several math ...
- 【HNOI】五彩斑斓 模拟
[题目描述] 给定一个n*m的矩阵,矩阵的某些位置有一个颜色(可以没有颜色,即为0),现在你可以将矩阵的某一行或者某一列染成同一种颜色,问最少用多少步能达到目标矩阵的染色方案,输出最少步数和方案. [ ...
- vs调试 配置IISExpress允许局域网内部访问
内网可访问后,本机不能使用localhost 1.找到IISExpress的配置文件,位于 <文档>/IISExpress/config文件夹下,打开applicationhost.c ...
- ES6新增的let与const
1.const 声明常量,一旦声明必须立马赋值,否则报错 const PI = 3.14 const PI; //报错:Uncaught SyntaxError: Missing initialize ...
- Java 中的方法内部类
方法内部类就是内部类定义在外部类的方法中,方法内部类只在该方法的内部可见,即只在该方法内可以使用. 一定要注意哦:由于方法内部类不能在外部类的方法以外的地方使用,因此方法内部类不能使用访问控制符和 s ...
- FastDFS介绍和配置过程
由于网站使用nfs共享方式保存用户上传的图片,附件等资料,然后通过apache下载的方式供用户访问,在网站架构初期,使用这种简单的方式实现了静态资源的读写分离,但随着网站数据量的增加,图片服务器渐渐成 ...
- [Leetcode Week16]Insertion Sort List
Insertion Sort List 题解 原创文章,拒绝转载 题目来源:https://leetcode.com/problems/insertion-sort-list/description/ ...
- linux 设备树【转】
转自:http://blog.csdn.net/chenqianleo/article/details/77779439 [-] linux 设备树 为什么要使用设备树Device Tree 设备树的 ...