前言:终于乐观(optimistic)(打表打漏了,还是比较高)


JZOJ 3382 七夕祭

题目

环(jiang)形(de)均(tai)分(cao)纸(shuai)牌(le)


分析

首先在做这道题之前,要知道均分纸牌,设 A [ i ] = C [ i ] − S U M / N A[i]=C[i]-SUM/N A[i]=C[i]−SUM/N,然后S[i]是A[i]的前缀和,答案就是 ∑ ∣ S [ i ] ∣ \sum |S[i]| ∑∣S[i]∣,但是这是环形的,当从k断开可以得到最优解,那么

A S
K+1 A[K+1] S[K+1]-S[K]
K+2 A[K+2] S[K+2]-S[K]
N A[N] S[N]-S[K]
1 A[1] S[1]+S[N]-S[K]
2 A[2] S[2]+S[N]-S[K]
K A[K] S[K]+S[N]-S[K]
因为S[N]=0,所以可以转换成最小的$\sum_{i=1}^n S[i]-S[k] $,所以就想到了中位数,不需要枚举k,中位数就是k,then时间复杂度O(nlogn+mlogm)

代码

#include <cstdio>
#include <cctype>
#include <algorithm>
using namespace std;
int a[100001],b[100001],n,m,t;
unsigned int ans1,ans2;
int in(){int ans=0; char c=getchar();while (!isdigit(c)) c=getchar();while (isdigit(c)) ans=ans*10+c-48,c=getchar();return ans;
}
int abs(int a){return (a<0)?-a:a;}
int main(){n=in(); m=in(); t=in();for (int i=1;i<=t;i++) a[in()]++,b[in()]++;for (int i=1;i<=n;i++) a[i]+=a[i-1]-t/n;for (int i=1;i<=m;i++) b[i]+=b[i-1]-t/m;if (t%n&&t%m) return !printf("impossible");stable_sort(a+1,a+1+n); stable_sort(b+1,b+1+m);for (int i=1;i<=n;i++) ans1+=1ll*abs(a[i]-a[(n+1)>>1]);for (int i=1;i<=m;i++) ans2+=1ll*abs(b[i]-b[(m+1)>>1]);if (!(t%n)&&!(t%m)) return !printf("both %lld",ans1+ans2);else if (t%m) return !printf("row %lld",ans1); else return !printf("column %lld",ans2);
}

JZOJ 3383 太鼓达人

题目

长度为M的环形01序列。从不同的位置出发可以得到M个长度为K的01串。M个01串应该是互不相同的。给出K,求出M的最大值,并给出字典序最小的方案。


分析

首先可以发现最后会跳回原来的串,所以就想到了欧拉图,所以深搜。很显然发现答案就是x
当前为x,向 2 x 按 位 与 2 k − 1 和 2 x + 1 按 位 与 2 k − 1 两 种 串 深 搜 ( 没 有 经 过 ) 2x按位与2^k-1和2x+1按位与2^k-1两种串深搜(没有经过) 2x按位与2k−1和2x+1按位与2k−1两种串深搜(没有经过),答案就是x二进制下的第一位,时间复杂度O( 2 k 2^k 2k)


代码

#include <cstdio>
using namespace std;
int n,pow; bool ans[2051],v[2051];
bool dfs(int x,int k){if (v[x]) return 0;if (k==pow) return 1;v[x]=1; ans[k]=x&1;if (dfs((x<<1)&(pow-1),k+1)) return 1;//顺序很重要if (dfs((x<<1|1)&(pow-1),k+1)) return 1;return v[x]=0;
}
int main(){scanf("%d",&n); printf("%d ",pow=1<<n);for (int i=1;i<n;i++) putchar('0'); dfs(0,1);for (int i=1;i<=pow-n+1;i++) putchar(ans[i]+48); return 0;
}

JZOJ 3384 理科男

题目

求在k进制下,a/b小数部分的非循环节长度(即有限小数和混循环小数的前部分)和循环节长度


分析

首先要介绍正向取整法,
0.3 × 3 = 0.9 , 0.9 × 3 = 2.7 , 0.7 × 3 = 2.1 , 0.1 × 3 = 0.3 0.3\times3=0.9,0.9\times3=2.7,0.7\times3=2.1,0.1\times3=0.3 0.3×3=0.9,0.9×3=2.7,0.7×3=2.1,0.1×3=0.3
所以 ( 0.3 ) 10 = ( 0.022 ) 3 ( 022 循 环 ) (0.3)_{10}=(0.022)_{3}(022循环) (0.3)10​=(0.022)3​(022循环)
所以50分的代码就是用map库或者哈希存下余数,如果余数出现过那么退出,但是非常慢。
2333333333333333333333333333333333333333333333333333333333333333333333333
考虑 ( 7 30 ) 10 = ( 7 15 ) 10 ÷ 2 = ( 7 3 ) 10 ÷ 10 (\frac{7}{30})_{10}=(\frac{7}{15})_{10}\div 2=(\frac{7}{3})_{10}\div 10 (307​)10​=(157​)10​÷2=(37​)10​÷10
所以处理混循环小数和有限小数,保证gcd(a,b)=1,之后
w h i l e ( ( d = g c d ( b , c ) ) &gt; 1 ) i n c ( a n s ) , b ÷ = d while ((d=gcd(b,c))&gt;1) inc(ans),b\div=d while((d=gcd(b,c))>1)inc(ans),b÷=d,ans就是第一个问题的答案。
当b=1时证明是有限小数,否则处理过后的混循环小数变成纯循环小数。
思考 a ∗ k q ≡ a ( m o d p ) a*k^q\equiv a(mod p) a∗kq≡a(modp),q即所求答案,两边同时除以a得到 k q ≡ 1 ( m o d p ) k^q\equiv 1(mod p) kq≡1(modp)
根据欧拉定理, a φ ( p ) ≡ 1 ( m o d p ) a^{\varphi(p)}\equiv 1(mod p) aφ(p)≡1(modp),但 φ ( p ) \varphi(p) φ(p)不是最优解,所以在 φ ( p ) \varphi(p) φ(p)的最小因数中找到答案。
why?the reason is kind of easy.
反证法,假设 a x ≡ 1 ( m o d p ) a^x\equiv 1(mod p) ax≡1(modp)的最小整数解 x 0 x_0 x0​不是 φ ( p ) \varphi(p) φ(p)的因数。
设 φ ( p ) = n x 0 + r ( 0 &lt; r &lt; x 0 ) , \varphi(p)=nx_0+r(0&lt;r&lt;x_0), φ(p)=nx0​+r(0<r<x0​),因为 a x 0 ≡ 1 ( m o d p ) , a^{x_0}\equiv 1(mod p), ax0​≡1(modp),所以 a n x 0 ≡ 1 ( m o d p ) a^{nx_0}\equiv 1(mod p) anx0​≡1(modp)
根据欧拉定理 a φ ( p ) ≡ 1 ( m o d p ) a^{\varphi(p)}\equiv 1(mod p) aφ(p)≡1(modp),所以 a r ≡ 1 ( m o d p ) a^r\equiv 1(mod p) ar≡1(modp),所以假设不成立。证毕。
时间复杂度 O ( b ) O(\sqrt b) O(b ​)


代码

#include <cstdio>
#include <cctype>
#include <algorithm>
using namespace std;
typedef long long ll;
ll a,b,c,t,d;
ll in(){ll ans=0; char c=getchar();while (!isdigit(c)) c=getchar();while (isdigit(c)) ans=ans*10+c-48,c=getchar();return ans;
}
void print(ll ans){if (ans>9) print(ans/10); putchar(ans%10+48);}
ll mul(ll a,ll x){ll ans=0;while (x){if (x&1) ans=(ans+a)%b;a=(a<<1)%b; x>>=1;}return ans;
}
ll ksm(ll a,ll x){ll ans=1;while (x){if (x&1) ans=mul(ans,a);a=mul(a,a); x>>=1;}return ans;
}
ll answer(){ll n=b,x=b,k=0;for (int i=2;(ll)i*i<=n;i++)if (n%i==0){x=x/i*(i-1);while (n%i==0) n/=i;}if (n>1) x=x/n*(n-1); n=x;for (int i=2;(ll)i*i<=x;i++)if (x%i==0){while (n%i==0&&ksm(c,n/i)==1) n/=i; while (x%i==0) x/=i;}if (x>1&&ksm(c,n/x)==1) n/=x;return n;
}
int main(){t=in();while (t--){a=in(); b=in(); c=in(); ll ans=0;a/=(d=__gcd(a,b)); b/=d;while ((d=__gcd(b,c))>1) ans++,b/=d;if (ans) print(ans); else putchar('0'); putchar(' '); ans=0;if (b>1) ans=answer();if (ans) print(ans); else putchar('0'); putchar('\n');}return 0;
}

JZOJ 3385 黑魔法师之门

题目

求 2 简 单 环 − 1 2^{简单环}-1 2简单环−1


分析

用并查集,当前连的边不需要连就可以连通那么ans=ans*2(初始值为1),否则合并,每次连边后输出ans-1,按秩合并+路径压缩后时间复杂度 O ( m α ( N ) ( 大 概 是 6 m ) ) O(m\ \alpha (N)(大概是6m)) O(m α(N)(大概是6m))


代码

#include <cstdio>
#include <cctype>
#define mod 1000000009
using namespace std;
int n,m,ans=1,x,y,f[200001];
int in(){int ans=0; char c=getchar();while (!isdigit(c)) c=getchar();while (isdigit(c)) ans=ans*10+c-48,c=getchar();return ans;
}
int min(int a,int b){return (a<b)?a:b;}
int max(int a,int b){return (a>b)?a:b;}
void print(int ans){if (ans>9) print(ans/10); putchar(ans%10+48);}
int getf(int u){return (f[u]==u)?u:f[u]=getf(f[u]);}
int main(){n=in(); m=in();for (int i=1;i<=n;i++) f[i]=i;while (m--){x=in(); y=in();int u=getf(x); int v=getf(y);if (u==v) ans=(1ll*ans*2)%mod;else f[min(u,v)]=max(u,v);if (ans>1) print(ans-1); else putchar('0'); putchar('\n');}return 0;
}

后续

codevs 2485 七夕祭 洛谷 2512 JZOJ 1472 糖果传递 洛谷 1031 均分纸牌 codevs 2486 太鼓达人
codevs 2487 理科男 codevs 1995 黑魔法师之门

2018.07.13【2018提高组】模拟C组相关推荐

  1. 2018.07.17【省赛模拟】模拟B组 比赛总结

    题目 [GDKOI2003]最大公共子串 [题目描述] 从一个给定的串中删去(不一定连续地删去)0个或0个以上的字符,剩下的字符按原来的顺序组成的串是该串的字串.例如:"", &q ...

  2. 2018.07.17【省赛模拟】模拟B组 比赛题解(总结)

    今天一看排名,what the,又垫底了,新初二第一YYT287.5,第二WYD120 T1: 最大公共子串 分类讨论+DP 题目描述 从一个给定的串中删去(不一定连续地删去)0个或0个以上的字符,剩 ...

  3. JZOJ5857 【NOIP提高组模拟A组2018.9.8】没有上司的舞会

    题目 Description "那么真的有果尔德施坦因这样一个人?"他问道. "是啊,有这样一个人,他还活着.至于在哪里,我就不知道了." "那么那个 ...

  4. 苏嵌//张朋//2018.07.13

    苏嵌                                                                                                   ...

  5. JZOJ 5281. 【NOIP提高组模拟A组8.15】钦点

    Description Input Output Sample Input 4 4 2 a a b b a a b b c c d d c c d d 1 1 3 3 2 2 3 1 1 3 2 2 ...

  6. 【二分,找规律】Day 14 提高组模拟C组 T1 小麦亩产一千八

    题目大意 给定斐波那契的第aaa项,求出第b" role="presentation">bbb项,默认第0项为1 解题思路 方法一:递推 找到规律后O(b)O(b) ...

  7. 苏嵌学习日志03 07.13

    学习日志      姓名:刘易中      日期:2018/07/13 今日学习任务 结构体.结构体和链表.内存管理.关键字union.enum.typedef等.   今日任务完成情况 (详细说明本 ...

  8. JZOJ 5814. 【NOIP提高A组模拟2018.8.14】 树

    梦游中的你来到了一棵 N 个节点的树上. 你一共做了 Q 个梦, 每个梦需要你从点 u 走到点 v 之后才能苏醒, 由于你正在梦游, 所以每到一个节点后,你会在它连出去的边中等概率地选择一条走过去, ...

  9. 2018.12.08【NOIP提高组】模拟B组总结(未完成)

    2018.12.08[NOIP提高组]模拟B组总结 diyiti 保留道路 进化序列 B diyiti Description 给定n 根直的木棍,要从中选出6 根木棍,满足:能用这6 根木棍拼出一个 ...

最新文章

  1. 浪潮集团执行总裁王柏华:这次人工智能产业发展大潮“是真的”
  2. 回顾丨2017年人工智能带火了哪些词
  3. 工作流-----WorkFlow
  4. 自考计算机本科学校好,自考本科的难度跟选择的专业有关吗?过来人:有很大的关系...
  5. Ensure that you have installed a JDK (not just a JRE) and configured your JAVA_HOME system variable
  6. C#里调用带输出参数的存储过程
  7. linux之which命令
  8. java cxf 双向通讯_CXF 在spring boot 2 发布多个服务
  9. 2020云计算,是四强争霸还是赢家通吃?
  10. 【嵌入式工程师面试高频问题】你知道IIC吗(附程序说明)
  11. mysql.exe怎么全屏_监控怎么调为全屏
  12. 使用postman下载文件
  13. 线程池提交执行任务中execute()方法和submit()的区别
  14. LaTeX常用表格绘制入门
  15. 《缠中说禅108课》24::MACD 对背弛的辅助判断
  16. CSDN钱包提现协议
  17. 金三银四,作为Java程序员的你为什么面试总拿不到高薪?
  18. sql语句查询时,where条件同时使用and和or
  19. 人生在世,最大的笑话莫过于自作多情...
  20. 为什么28岁不能学java_28岁大龄人学java不是不可能

热门文章

  1. cordova调用java_Cordova入门系列(三)Cordova插件调用
  2. 总结:四张图读懂手游发行公司的日常工作
  3. 码云小课题 | 主流开源协议有哪些?我们该如何选择?
  4. 网页设计作业——电影网H5(9页) HTML+CSS+JavaScript 学生DW网页设计作业成品 web课程设计网页规划与设计 计算机毕设网页设计源码
  5. 从科技巨头的布局看未来物联网发展趋势
  6. linux声音进程,【转】Linux下的测试和使用声音的工具
  7. Llinux启动流程详解
  8. [绘画]程序转画师新手绘画建议
  9. 用python编写一个点餐程序_用python做一个点餐系统,热敏打印机怎么连?
  10. RestControllerAdvice作用及原理---自定义异常处理(全局异常处理)