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)

  1. #include<bits/stdc++.h>
  2. #define ll long long
  3. using namespace std;
  4.  
  5. int zs[10]={2,3,5,7,11,13,17,19,23,29},n,i;
  6.  
  7. inline int ksm(int x,int y,const int ha){
  8. int an=1;
  9. for(;y;y>>=1,x=x*(ll)x%ha) if(y&1) an=an*(ll)x%ha;
  10. return an;
  11. }
  12.  
  13. int main(){
  14. scanf("%d",&n);
  15. if(n==1) puts("3");
  16. else if(n==2) puts("4");
  17. else for(;i<10;i++) if(n%zs[i]){
  18. const int ha=zs[i];
  19. printf("%d\n",(ha-1)*(ll)ksm(n%ha,ha-2,ha)%ha);
  20. break;
  21. }
  22. return 0;
  23. }

2.PolandBall and Game

题面在这里!

很裸很裸的一个贪心,肯定是优先选重叠的,所以hash一下直接贪就好啦QWQ

  1. #include<bits/stdc++.h>
  2. #define ll unsigned long long
  3. using namespace std;
  4.  
  5. unordered_map<ll,int> mmp;
  6. int n,m,tot;
  7. ll now;
  8. char c;
  9.  
  10. int main(){
  11. scanf("%d%d",&n,&m);
  12.  
  13. for(int i=1;i<=n;i++){
  14. for(c=getchar(),now=0;c!='\n';c=getchar()) now=now*(ll)73+c-'a'+3ll;
  15. if(!now){ i--; continue;}
  16. mmp[now]=1;
  17. }
  18. for(int i=1;i<=m;i++){
  19. for(c=getchar(),now=0;c!='\n';c=getchar()) now=now*(ll)73+c-'a'+3ll;
  20. if(!now){ i--; continue;}
  21. if(mmp[now]) tot++;
  22. }
  23.  
  24. n+=(tot&1);
  25. puts(n>m?"YES":"NO");
  26.  
  27. return 0;
  28. }

3.PolandBall and Forest

题面在这里!

又是一道神仙题。

可以证明同一颗树里面的p[]一定是点标号严格最小的直径中的一个端点,这个玩意还是画画图比较好理解。。。

于是我们就找一找这种端点互相对应的直径数就好啦。

  1. #include<bits/stdc++.h>
  2. #define ll long long
  3. using namespace std;
  4. const int N=10005;
  5.  
  6. int n,a[N],cnt;
  7.  
  8. int main(){
  9. scanf("%d",&n);
  10. for(int i=1;i<=n;i++) scanf("%d",a+i);
  11. for(int i=1;i<=n;i++) if(a[i]>=i&&a[a[i]]==i) cnt++;
  12. printf("%d\n",cnt);
  13. return 0;
  14. }

4.PolandBall and Gifts

题面在这里!

把置换拆成环之后,可以发现一个位置不带礼物会影响环上它和它的后继,那么两种极值肯定是希望 影响尽量重叠 或者 尽量不重叠。

最小化的话就是尽量重叠,可以发现当且仅当物品看成是环大小的背包可以凑出k的时候答案是k;否则就是k+1。

直接背包肯定会凉凉啊,但是多重背包可以把每个物品的体积拆成 1 + 2 + 4 + ... + lef,偶数项都可以放到更大的体积的物品中去(因为 ∑每种物品的体积×个数 = N,所以不会出事),所以每种物品最多加两次,并且最多加sqrt(N)种不同的物品(想一想为什么),于是bitset一下复杂度刚刚好是 3*1e7,卡着过(虽然实际复杂度非常优秀)。

最大化非常简单,直接贪心就好啦QWQ

  1. #include<bits/stdc++.h>
  2. #define ll long long
  3. using namespace std;
  4. const int N=1e6+5;
  5.  
  6. inline int read(){
  7. int x=0; char ch=getchar();
  8. for(;!isdigit(ch);ch=getchar());
  9. for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0';
  10. return x;
  11. }
  12.  
  13. bitset<N> B;
  14. int n,p[N],k,K,ans[2],lef,c[N];
  15. bool v[N];
  16.  
  17. inline int getlen(int x){
  18. int an=0;
  19. for(;!v[x];x=p[x]) v[x]=1,an++;
  20. return an;
  21. }
  22.  
  23. inline void solve0(){
  24. for(int i=1,now;i<=n;i++) if(!v[i]){
  25. now=getlen(i),c[now]++;
  26. lef+=now&1,now^=now&1;
  27. if(K>=(now>>1)) K-=now>>1,ans[0]+=now;
  28. else if(K) ans[0]+=K<<1,K=0;
  29. }
  30. if(K) ans[0]+=min(K,lef);
  31. }
  32.  
  33. inline void solve1(){
  34. B[0]=1;
  35. for(int i=1;i<=n;i++) if(c[i]){
  36. B|=B<<i,c[i]--;
  37. if(c[i]&1) B|=B<<i;
  38. c[i<<1]+=c[i]>>1;
  39. }
  40. ans[1]=B[k]?k:k+1;
  41. }
  42.  
  43. int main(){
  44. n=read(),K=k=read();
  45. for(int i=1;i<=n;i++) p[i]=read();
  46. solve0(),solve1();
  47. printf("%d %d\n",ans[1],ans[0]);
  48. return 0;
  49. }

5.Fix a Tree

题面在这里!

首先原图肯定是若干基环树,我们的任务就是最后只留一个联通的基环树,并且环还得是自环。

先看一看原图中有没有自环,如果有的话就随便找一个当根。

然后用并查集维护联通性,如果i和p[i]已经在一个联通分量里的话,就把p[i]指向根,并且ans++。

当然,如果原来就没有根的话那么就把i设为根,最后答案是一样的。

可以证明答案总是 : 联通分量个数 - [原图中有没有自环]

  1. #include<bits/stdc++.h>
  2. #define ll long long
  3. using namespace std;
  4. const int N=200005;
  5.  
  6. inline int read(){
  7. int x=0; char ch=getchar();
  8. for(;!isdigit(ch);ch=getchar());
  9. for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0';
  10. return x;
  11. }
  12.  
  13. void W(int x){ if(x>=10) W(x/10); putchar(x%10+'0');}
  14.  
  15. int p[N],n,root,a[N],ans;
  16.  
  17. int getf(int x){ return p[x]==x?x:(p[x]=getf(p[x]));}
  18.  
  19. int main(){
  20. n=read();
  21. for(int i=1;i<=n;i++) p[i]=i,a[i]=read();
  22. for(int i=1;i<=n;i++) if(a[i]==i){ root=i; break;}
  23.  
  24. for(int i=1,fa,fb;i<=n;i++) if(i!=root){
  25. fa=getf(i),fb=getf(a[i]);
  26. if(fa!=fb) p[fa]=fb;
  27. else{
  28. ans++;
  29. if(root) a[i]=root;
  30. else root=a[i]=i;
  31. }
  32. }
  33.  
  34. W(ans),puts("");
  35. for(int i=1;i<=n;i++) W(a[i]),putchar(' ');
  36. return 0;
  37. }

某5道CF水题的更多相关文章

  1. 几道cf水题

    题意:给你包含n个元素的数组和k种元素,要求k种元素要用完,并且每种颜色至少用一次,n个元素,如果某几个元素的值相同,这些个元素也不能染成同一种元素. 思路:如果元素个数n小于k或者值相同的元素的个数 ...

  2. 做了一道cf水题

    被一道cf水题卡了半天的时间,主要原因时自己不熟悉c++stl库的函数,本来一个可以用库解决的问题,我用c语言模拟了那个函数半天,结果还超时了. 题意大概就是,给定n个数,查询k次,每次查询过后,输出 ...

  3. 一道cf水题再加两道紫薯题的感悟

    . 遇到一个很大的数除以另一个数时,可以尝试把这个很大的数进行,素数因子分解. . 遇到多个数的乘积与另一个数的除法时,求是否能整除,可以先求每一个数与分母的最大公约数,最后若分母数字为1,则证明可整 ...

  4. 又一道简单题&&Ladygod(两道思维水题)

    Ladygod Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit S ...

  5. 一道cf水题

    题意:输入数字n表示字符串中元素个数,字符串中只含有RGB三个字符,现在要求任意两个相同的字符他们的下标之差能整除3. 思路:任意两个相同的字符的下标能整除3,也就是任意三个为一组的字符串当中的字符不 ...

  6. cf水题

    题意:输入多组数据,有的数据代表硬币的长宽,有的数据代表钱包的长宽,问你当这组数据代表钱包的长宽时,能不能把它前面出现的所有硬币全部装下. 思路:只要钱包的长宽大于前面出现的所有硬币的长宽就可以装下, ...

  7. 在$CF$水题の记录

    CF1158C CF1163E update after CF1173 很好,我!expert!掉rating了!! 成为pupil指日可待== 下次要记得合理安排时间== ps.一道题都没写的\(a ...

  8. 寒假第一发(CF水题两个)

    地址http://codeforces.com/contest/799 A. Carrot Cakes In some game by Playrix it takes t minutes for a ...

  9. Cf水题B - Combination

    地址: https://vjudge.net/problem/27861/origin Ilya plays a card game by the following rules. A player ...

随机推荐

  1. hdu 3371(prim算法)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3371 Connect the Cities Time Limit: 2000/1000 MS (Jav ...

  2. metlnfo 5.3.1 sql注入复现

    首先还是要说的是metlnfo是伪全局变量机制 所以如下: /admin/include/global.func.php function save_met_cookie(){ global $met ...

  3. %和format 细说

    Python中格式化字符串目前有两种阵营:%和format,我们应该选择哪种呢? 自从Python2.6引入了format这个格式化字符串的方法之后,我认为%还是format这根本就不算个问题.不信你 ...

  4. c#中char、string转换为十六进制byte的浅析

    问题引出: string转换为byte(十六进制) static void Main(string[] args) { "; byte[] b = Encoding.Default.GetB ...

  5. docker安装(2016-08-25版本)

    . 通过命令对系统的版本进行查看 [root@localhost ~]# uname -a [root@localhost ~]# cat /etc/issue --> 如果是6.5之前的版本 ...

  6. FineReport——JS二次开发(复选框全选)

    在进行查询结果选择的时候,我们经常会用到复选框控件,对于如何实现复选框全选,基本思路: 在复选框中的初始化事件中把控件加入到一个全局数组里,然后在全选复选框里对数组里的控件进行遍历赋值. 首先,定义两 ...

  7. maven项目的多级目录

    刚刚把一个开源的项目变成maven项目来进行管理,由于是多级的目录(以前配置的都是单级的目录),所以记录一下pom文件是怎么配置的. 一.目录结构 如下,maven的结构图,红字是表示完整的项目

  8. leetcode 136 137 Single Number

    题目描述(面试常考题) 借助了异或的思想 class Solution { public: int singleNumber(vector<int>& nums) { ; ; i ...

  9. CF633F The Chocolate Spree

    Description Alice and Bob have a tree (undirected acyclic connected graph). There are \(a_{i}\) choc ...

  10. django “如何”系列7:错误汇报

    当你正在运行一个公共的站点的时候,你应该关掉DEBUG设置.这将使你的服务器运行的更快,同时也能预防别有用心的用户从你的错误页面看到你应用的一些详细配置信息.然而,当debug为false的时候,你将 ...