博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【Codeforces #166 Div2】Solutions
阅读量:5252 次
发布时间:2019-06-14

本文共 4013 字,大约阅读时间需要 13 分钟。

  好久没有做CF了手生的很。。。

 

  【A.Beautiful Year】

  

  题目大意:四位数都不同的年份被称为“Beautiful Year”,问一个给定年份之后最近的“Beautiful Year”

  模拟就可以了。。。

View Code
1 #include 
2 #include
3 #include
4 #include
5 using namespace std; 6 7 int n; 8 bool vis[10]; 9 10 bool check(int x){11 memset(vis,false,sizeof(vis));12 while(x){13 int tmp=x%10;14 x/=10;15 if(vis[tmp]) return false;16 vis[tmp]=true;17 }18 return true;19 }20 21 int main(){22 cin>>n;23 n++;24 while(!check(++n))25 cout<
<

 

  【B.Prime Matrix】

  

  题目大意:n×m的格子,每次操作可以将一个格子中的数字加1,问最少操作次数使得存在一行或一列全为质数。

  预处理出每个格子需要多少次操作成为质数,然后求最小行、列和即可。素数筛表即可,注意多筛一些。

View Code
1 #include 
2 #include
3 #include
4 #include
5 using namespace std; 6 template
inline void gmin(T &a,T b){
if(a>b)a=b;} 7 8 int n,m,a[1010][1010],prime[101000],tot,ans=2147483647,sum[1010][1010]; 9 bool vis[200010];10 11 int check(int x,int y){12 int t=a[x][y];13 int low=1,high=tot,mid;14 while(low
>1;16 if(prime[mid]
>n>>m;24 for(int i=1;i<=n;i++)25 for(int j=1;j<=m;j++)26 cin>>a[i][j];27 for(int i=2;i<=200010;i++)28 if(!vis[i]){29 for(int j=2;j*i<=200000;j++)30 vis[j*i]=true;31 }32 for(int i=2;i<=200000;i++)33 if(!vis[i]) prime[++tot]=i;34 35 for(int i=1;i<=n;i++)36 for(int j=1;j<=m;j++)37 check(i,j);38 for(int i=1;i<=n;i++){39 int tmp=0;40 for(int j=1;j<=m;j++)41 tmp+=sum[i][j];42 gmin(ans,tmp);43 }44 for(int i=1;i<=m;i++){45 int tmp=0;46 for(int j=1;j<=n;j++)47 tmp+=sum[j][i];48 gmin(ans,tmp);49 }50 cout<
<

  【C.Secret】

  

  题目大意:n个物品分给k个人,使得每件物品所属的人的编号都不组成等差数列,找出可行方案。

  这题做法有很多,随便构造一下就可以了。首先如果k*3<=n的话一定是无解的,因为这样肯定存在一个人拥有少于三个物品,那么必然构成等差数列。

  满足之后就构造。可以1...k 1...k k...1,也可以112233...kk 1..k,and so on

View Code
1 #include 
2 #include
3 #include
4 #include
5 using namespace std; 6 7 int n,m; 8 9 int main(){10 cin>>n>>m;11 if(m*3>n){12 cout<<-1<

 

  【D.Good Substrings】

  

  题目大意:存在不多于k个"坏"字母的字符串叫做“Good Substring”,问字符串s中有多少个不同子串是"Good Substring"。

  复杂度不高,可以预处理前缀和(坏字母个数),然后枚举左右端点,哈希判重,这里直接用map了。。。

View Code
1 #include 
2 #include
3 #include
4 using namespace std; 5 6 const long long BASE=29; 7 const long long MOD=10000000000000000LL; 8 map
m; 9 long long base[2000],hash;10 int k,cnt;11 string s,good;12 13 int main(){14 cin>>s>>good>>k;15 int len=s.length();16 base[0]=1;17 for(int i=1;i<=len;i++)18 base[i]=(base[i-1]*BASE)%MOD;19 for(int i=0;i
k) break;24 hash=(hash+(long long)(s[j]-'a'+1)*base[j-i])%MOD;25 m[hash]=true;26 }27 }28 cout<
<

 

  【E.Three Horses】

  

  题目大意:有三种转换(具体看题),问有多少种(x,y),x<=y<=m能通过转换得到所有二元组(1,an)

  思路来自cxlove blog:

  从二元组(x,y)的差d=y-x来考虑。

  对于第一个操作(x,y)->(x+y),(x,y)->(y,2y-x)->(x,2y-x)->(2x-2,2y-2)->(x-1,y-1),由此可知一个差为d的二元组(x,y)可以推出所有差为d的二元组(x',y')。

  对于第二个操作,(x,x+d)->(x/2,x/2+d/2),d'=d/2,差减半,由此可知一个差为d的二元组可以退出所有差为d^(2k)的所有二元组(x',y')。

  对于第三个操作,(x,x+d1)&(x+d1,x+d1+d2)->(x,x+d1+d2),差为两个二元组差的和,由此可知由一个差为d的二元组(x,y)可以推出所有差为kd的二元组(x',y')。

  综上,我们可以找出所有可以推出目标二元组的可能的“差”,如果差为d,且x<=y<=m,则差为d的可能的初始二元组有m-d个。

View Code
1 #include 
2 using namespace std; 3 4 int n,m,a,gcd; 5 long long ans; 6 7 int GCD(int a,int b){ 8 return b==0?a:GCD(b,a%b); 9 }10 11 int main(){12 cin>>n>>m;13 for(int i=0;i
>a;15 gcd=GCD(gcd,a-1);16 }17 while(!(gcd&1)) gcd>>=1;18 for(int i=1;i*i<=gcd;i++)19 if(!(gcd%i)){20 for(int j=i;j
<<=1) ans+=m-j;21 if(i*i

 

转载于:https://www.cnblogs.com/Delostik/archive/2013/02/14/2911197.html

你可能感兴趣的文章
RabbitMQ、Redis、Memcache、SQLAlchemy
查看>>
03 线程池
查看>>
手机验证码执行流程
查看>>
设计模式课程 设计模式精讲 2-2 UML类图讲解
查看>>
Silverlight 的菜单控件。(不是 Toolkit的)
查看>>
jquery的contains方法
查看>>
linux后台运行和关闭SSH运行,查看后台任务
查看>>
桥接模式-Bridge(Java实现)
查看>>
303. Range Sum Query - Immutable
查看>>
C# Dynamic通用反序列化Json类型并遍历属性比较
查看>>
前台freemark获取后台的值
查看>>
Leetcode: Unique Binary Search Trees II
查看>>
C++ FFLIB 之FFDB: 使用 Mysql&Sqlite 实现CRUD
查看>>
Spring-hibernate整合
查看>>
c++ map
查看>>
exit和return的区别
查看>>
Django 相关
查看>>
比较安全的获取站点更目录
查看>>
Python(软件目录结构规范)
查看>>
Windows多线程入门のCreateThread与_beginthreadex本质区别(转)
查看>>