所有的题目在这里<---

待补...

Problem A. HDU6264:Super-palindrome

题意:

  题目定义了一个超级回文串,这个串满足:它的任一奇数长度的串都是回文串。

  现在给你一个字符串,问你把它变成超级回文串需要多少次操作。每次操作可以把一个字符变成其他任一字符。

题解:

  显然,一个串只有符合 整个串奇数位字符都相同,偶数位字符都相同,奇数位偶数位字符不一定要相同(包含了字符全相同的情况)时满足超级回文。

代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = +;
const int INF = 1e9+;
const ll mod = ;
int main(){
int T;
scanf("%d",&T);
for (int t = ; t <= T; ++t) {
string s;
cin >> s;
int a1[]={},a2[]={};
int l = s.length(),num1=,num2=;
for (int i = ; i < l; ++i) {
if (i%) num2 = max(num2,++a2[s[i]]);
else num1 = max(num1,++a1[s[i]]);
}
printf("%d\n",(l/-num1)+(l-l/-num2));
}
return ;
}

Problem B.HDU6265:Master of Phi

题意:

  求 

题解:

代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = +;
const int INF = 1e9+;
const ll mod = ;
ll qp(ll a, ll b){
ll ans = ;
while (b) {
if (b&) ans = (ans * a) % mod;
a = (a * a) % mod;
b >>= ;
}
return ans;
}
int main() {
int T,n;
scanf("%d",&T);
while (T--) {
ll ans = ,p,q;
scanf("%d",&n);
for (int i = ; i < n; i++){
scanf("%lld%lld",&p,&q);
ans=(ans*(qp(p,q)+((p-)*q%mod)*qp(p,q-)%mod))%mod;
}
printf("%lld\n",ans);
}
return ;
}

 

Problem C.HDU6266:Hakase and Nano

题意:

  有n堆石子,每次可以选择任意一堆从中取至少一个石子,谁最后取完谁赢。

  Hakase取两次,Nano取一次,两个人轮流取。问 Hakase是否能赢。

题解:

  一堆石子如果只有一个,那么一次就取走了一堆,堆数减少;否则这一堆可以有剩余,堆数可以不变。

  当 Hakase先取石子时,只有在每堆石子数量都为1且堆数是3的倍数时 Hakase会输,其余情况都会赢。

  当 Nano先取石子时,Nano拿了第一次之后,就相当于成了Hakase先手。所以要使Hakase输需要使Nano拿了第一次之后每堆石子数量都为1且剩下的堆数是三的倍数,否则Hakase赢。这时有3种情况:

  1.每堆石子都为1,且 堆数-1 是3的倍数。

  2.只有一堆石子数量不为1,Nano将这堆石子全拿走,剩下 n-1堆石子数量全为1,且 n-1 是3的倍数。

  3.只有一堆石子数量不为1,Nano将这堆石子剩一个,剩下 n 堆石子数量全为1,且 n 是3的倍数。

  只有以上4种情况输出No,否则都是Yes。判断一下就行了。

代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = +;
const int INF = 1e9+;
const ll mod = ;
int main(){
int T,n,d,x;
scanf("%d",&T);
while (T--){
int num = ;
scanf("%d%d",&n,&d);
for (int i = ; i < n; ++i) {
scanf("%d",&x);
if (x == ) num++;
}
bool fg = ;
if (n == num) {
num %= ;
if (d == && !num) fg = ;
else if (d == && num == ) fg = ;
} else if (n == num+) {
if (d == &&((n%)==||(num%)==)) fg = ;
}
printf("%s\n",fg?"Yes":"No");
}
return ;
}

Problem D. HDU6267Master of Random

题意:

  之前没看到样例二的解释,然后搞了很久才弄懂题目意思...

  有一颗树节点由0~n-1编号,0为根节点,其余点i的父节点随机在(0,i-1)中选一个,问所有情况下所有子树的和除以子树个数后的答案。

  答案可能很大需要mod 998244353。

题解:

  看懂题意之后就很好做了。

  我们可以先把由1~4个节点组成的符合条件的树先画出来:

  

  显然我们能发现,当节点数量为n时,节点0~n-1分别被计算了:

  0 : (n-1)!
  1 : (n-1)! + (n-1)!/1 
       2 : (n-1)! + (n-1)!/1 +(n-1)!/2
  ......
  n-1 : (n-1)! + (n-1)!/1 +(n-1)!/2+...+(n-1)!/(n-1)

  那么我们能得到所有的子树和和为(n-1)! * a[0] + ((n-1)! + (n-1)!/1) * a[1] + ... + ( (n-1)! + (n-1)!/1 +(n-1)!/2+...+(n-1)!/(n-1) ) * a[n-1]

  子树个数为 (n-1)! * n  (树的排列方式数 * 节点数)
  因为有除法取摸,所以要用到逆元 a^(mod-2)
 代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = +;
const int INF = 1e9+;
const ll mod = ;
ll pq(ll a, ll b){
ll ans = ;
while (b) {
if (b&) ans = (ans * a) % mod;
a = (a * a) % mod;
b >>= ;
}
return ans;
}
ll ive(ll x) {
return pq(x,mod-);
}
int main() {
int T,n;
scanf("%d",&T);
while (T--) {
ll fm = , x;
scanf("%d%lld",&n,&x);
for (ll i = ; i < n; i++){
fm = (fm*i)%mod;
}
ll num = fm, ans = (fm * x) % mod;
for (int i = ; i < n; ++i) {
scanf("%lld",&x);
num = (num + fm*ive(i))%mod;
ans = (ans + num*x%mod)%mod;
}
fm = (fm*n)%mod;
printf("%lld\n",ans*ive(fm)%mod);
}
return ;
}

Problem J. HDU6273:Master of GCD

题意:

  一开始有n个全为1的数,每次操作你选择一个区间[l,r]和一个x,将这个区间内的每个数更新为乘以x之后的值,x只能是2或者3。问m次操作之后,所有数的最大公约数是多少。

题解:

  一开始所有数都为1,然后对每个区间的数进行乘法运算,那么所有数的最大公约数就是他们乘的同一个数的最小次方的乘积。

  例如:假设3个1,第一个乘了2次2和3次3,第二一个乘了3次2和2次3,第三个乘了4次2和1次3。那么他们的最大公约数为2的2次方与3的1次方的乘积。

  那么我们只需要记录一下每个数乘了几次2和3就行了。一开始用的树状数组,后来发现可以直接用前缀和。算结果时用快速幂取模即可。

代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5+;
const int INF = 1e9+;
const ll mod = ;
ll num2[N],num3[N];
int T,n,m;
int lowbit(int x){
return x&(-x);
}
void update(int id,ll *a, ll x) {
while (id <= n) {
a[id] +=x;
id += lowbit(id);
}
} ll query(int id, ll *a) {
ll r = ;
while (id > ) {
r += a[id];
id -= lowbit(id);
}
return r;
}
ll pq(ll a, ll b) {
ll r = ;
while (b) {
if (b&) r = (r*a) % mod;
a = (a*a) % mod;
b>>=;
}
return r;
}
int main()
{
scanf("%d",&T);
while(T--) {
scanf("%d%d",&n,&m);
memset(num2,,sizeof(num2));
memset(num3,, sizeof(num3));
for (int i = ; i < m; ++i) {
int l,r,x;
scanf("%d%d%d",&l,&r,&x);
if (x == ){
update(l,num2,);
update(r+,num2,-);
}else {
update(l,num3,);
update(r+,num3,-);
}
}
ll n2 = query(,num2),n3 = query(,num3);
for (int i = ; i <= n; i++) {
n2 = min(n2,query(i,num2));
n3 = min(n3,query(i,num3));
}
printf("%lld\n",(pq(,n2)*pq(,n3))%mod);
}
return ;
}

树状数组

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = +;
const int INF = 1e9+;
const ll mod = ;
int a[][N];
ll pq(ll a, ll b){
ll ans = ;
while (b) {
if (b&) ans = (ans * a) % mod;
a = (a * a) % mod;
b >>= ;
}
return ans;
}
int main() {
int T,n,m;
scanf("%d",&T);
while (T--){
scanf("%d%d",&n,&m);
memset(a,,sizeof(a));
for (int i = ; i < m; ++i) {
int l,r,x;
scanf("%d%d%d",&l,&r,&x);
a[x-][l]++;
a[x-][r+]--;
}
ll n2, n3, sum2 , sum3;
n2 = sum2 = a[][];
n3 = sum3 = a[][];
for (int i = ; i <= n; ++i) {
sum2 += a[][i];
n2 = min(sum2,n2);
sum3 += a[][i];
n3 = min(sum3,n3);
}
printf("%lld\n",(pq(,n2) * pq(,n3))%mod);
}
return ;
}

前缀和

2017CCPC杭州(ABCDJ)的更多相关文章

  1. 2017CCPC 杭州 J. Master of GCD【差分标记/线段树/GCD】

    给你一个n个初始元素都为1的序列和m个询问q. 询问格式为:l r x(x为2or3) 最后求1~n所有数的GCD GCD:把每个数分别分解质因数,再把各数中的全部公有质因数提取出来连乘,所得的积就是 ...

  2. 2017ccpc 杭州Master of Sequence

    Problem K. Master of SequenceTherearetwosequencesa1,a2,··· ,an, b1,b2,··· ,bn. LetS(t) =∑n i=1⌊t−bi ...

  3. 2017 CCPC杭州 题解

    2017CCPC杭州题目PDF Problem A. Super-palindrome 题解: 给你一个字符串,每一步可以将一个字符替换为另一个字符,问你最少多少步可以使得,该字符串任意奇数子串为回文 ...

  4. HDU 4777 Rabbit Kingdom (2013杭州赛区1008题,预处理,树状数组)

    Rabbit Kingdom Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  5. MySQL_杭州北仓 12.3-12.7需求活动期间累计下单达到3天及以上的客户_20161212

    #C025_02杭州北仓 12.3-12.7需求活动期间累计下单达到3天及以上的客户明细 SELECT d.*,CASE WHEN 下单天次>=3 THEN "下单超过3天" ...

  6. 【社招】来杭州吧,阿里国际UED招前端~~

    来杭州吧,阿里国际UED招前端~~ 依稀记得,几年前在北京的日子,两点一线的生活方式,似乎冲淡模糊了身边的一切,印象最深刻的莫过于北京的地铁站了吧(因为只有等地铁,搭地铁的时候,才能够停下脚步,静静地 ...

  7. APICloud十一月线下活动(杭州、上海)

    阿里云创业大学 ——APICloud/银杏谷移动课堂[杭州站] 时间:2015年11月28日13:30-16:30 地点:文三路华星时代广场A座3楼银杏谷1024孵化器 主办:APICloud.阿里云 ...

  8. 30天,O2O速成攻略【8.29杭州站】

    活动概况 时间:2015年8月29日13:30-16:30 地点:123茶楼(杭州上城区青年路27号2楼) 主办:APICloud.UPYUN.一起火 网址:www.apicloud.com 费用:免 ...

  9. 2013杭州现场赛B题-Rabbit Kingdom

    杭州现场赛的题.BFS+DFS #include <iostream> #include<cstdio> #include<cstring> #define inf ...

随机推荐

  1. ubuntu14.04 dnsmasq搭建本地名字服务器

    1 修改dnsmasq配置文件/etc/dnsmasq.conf 在/etc/dnsmasq.conf文件底部增加 #++++++++++++++++++++++++++++++++++++++++ ...

  2. Pytorch | BERT模型实现,提供转换脚本【横扫NLP】

    <谷歌终于开源BERT代码:3 亿参数量,机器之心全面解读>,上周推送的这篇文章,全面解读基于TensorFlow实现的BERT代码.现在,PyTorch用户的福利来了:一个名为Huggi ...

  3. SVG和canvas画图,js求数组最大最小值

    windows命令行的内容怎么复制,右键选择标记,选中内容后再点击鼠标右键就复制了. 安装Node.js后再用npm install命令会出现如下warn:saveError ENOENT: no s ...

  4. Python--day61--Django ORM关系的简单梳理

    models.py中的代码和数据库中的表对应

  5. 2018-8-10-WPF-好看的矢量图标

    title author date CreateTime categories WPF 好看的矢量图标 lindexi 2018-08-10 19:16:53 +0800 2018-5-16 11:4 ...

  6. dotnet core 2.1 使用阶梯编译

    在 dotnet core 2.1 可以使用阶梯编译的方法,从 dotnet framework 开始,在代码的所有方法在第一次进入的时候就需要使用 JIT 进行编译为本机的代码.可以看到代码是在第一 ...

  7. linux scull 中的读写代码

    读和写方法都进行类似的任务, 就是, 从和到应用程序代码拷贝数据. 因此, 它们的原型 相当相似, 可以同时介绍它们: ssize_t read(struct file *filp, char   u ...

  8. P1031 栈的序列

    题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序 ...

  9. H3C重启设备

  10. Nginx与PHP交互过程 + Nginx与PHP通信的两种方式

    一.Nginx与PHP交互过程的7步走(用户对动态PHP网页访问过程) step1:用户将http请求发送给nginx服务器(用户和nginx服务器进行三次握手进行TCP连接) step2:nginx ...