「2017 Multi-University Training Contest 7」2017多校训练7
1002 Build a tree(递归)
有一棵n个点的有根树,标号为0到n-1,i号点的父亲是\(\lfloor\frac{i-1}{k}\rfloor\)号点,求所有子树大小的异或和。\(1\leq n,k\leq10^{18}\)。
找出n所在的链,然后从根开始递归处理。
k=1的时候特判,1异或到n,每4个异或起来为0。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll n,k;
int t,D;
ll f[64],siz[64],tot[64];
void init(){
D=1;
for(ll c=n-1;c;c=(c-1)/k)f[D++]=c;
reverse(f+1,f+D);
siz[0]=tot[0]=1;
for(ll i=1,j=k;i<=D;++i,j*=k){
siz[i]=siz[i-1]+j;
tot[i]=(k&1?tot[i-1]:0)^siz[i];
}
}
ll solve(int d){
if(d==D)return 1;
ll l=f[d]-f[d-1]*k-1;
ll r=k-l-1;
ll ans=n;
if(l&1)ans^=tot[D-d-1];
if(r&1)ans^=tot[D-d-2];
n-=siz[D-d-1]*l+siz[D-d-2]*r+1;
return ans^solve(d+1);
}
int main(){
scanf("%d",&t);
while(t--){
scanf("%lld%lld",&n,&k);
if(k==1){
ll ans=0;
for(ll i=n/4*4;i<=n;++i)
ans^=i;
printf("%lld\n",ans);
continue;
}
init();
printf("%lld\n",solve(1));
}
return 0;
}
1006 Free from square(状压DP)
不大于n的所有正整数中选出至少1个且至多k个使得乘积不包含平方因子,对\(10^9+7\)取模。\(1\leq n,k\leq 500\)。
因为500内全部质因子没法直接状压。所以只把小于根号n的质因子状压起来,只有8个。
将大于根号n的质数划分为不同组,每组包含它们各自的倍数,每个组只能选1个数。且前8个质数每个在选出来的数的因子中最多出现一次。这是一次背包。
1~n中不包含平方因子且不包含大于根号n的质因子的数,做01背包,也要求前8个质数都最多出现一次。
f[i][j][k]表示前i组中选j个数,包含的质因子状态为k的方案数
dp[i][j][k]表示前i个数选j个,包含的质因子状态为k的方案数
再把两个背包合并起来。
f计算成前缀和,即f[i][j][k]表示选不超过j个数的方案数。
最后答案还要减去1,因为不能两个都选0个。
第一维滚动。
#include <bits/stdc++.h>
#define ll long long
#define mem(a,b) memset(a,b,sizeof(a))
#define r(i,l,r,d) for(int i=(l);i<(r);i+=(d))
#define rep(i,l,r) for(int i=(l);i<(r);++(i))
#define add(x,y) x=(x+y)%M
const ll M=1e9+7;
const int N=515;
using namespace std;
int t,n,m;
ll dp[2][N][N];
ll f[2][N][N];
int p[N],cnt;//质数
bool isprime[N];
int s[N];//i中包含的质因子
int c;//第一个平方大于N的质数的下标
bool nofree[N];
void init() {
mem(isprime,1);
rep(i,2,N) if(isprime[i]) {
p[cnt++]=i;
if(i*i<N)c=cnt;
r(j,i,N,i) isprime[j]=false;
}
rep(i,2,N) rep(j,0,cnt) if(i%p[j]==0) {
if(j<c && (i/p[j])%p[j]) s[i]|=(1<<j);
else {
nofree[i]=true;
break;
}
}
}
int main() {
init();
scanf("%d",&t);
while(t--) {
scanf("%d%d",&n,&m);
mem(dp,0);
mem(f,0);
dp[0][0][0]=f[0][0][0]=1;
rep(i,1,n+1)if(!nofree[i]) {
rep(j,0,m+1) rep(k,0,1<<c) {
add(dp[1][j][k],dp[0][j][k]);//不选i
if(j<m && !(k&s[i]))
add(dp[1][j+1][k|s[i]],dp[0][j][k]);//选i
}
rep(j,0,m+1) rep(k,0,1<<c) dp[0][j][k]=dp[1][j][k],dp[1][j][k]=0;
}
rep(i,c,cnt) { //前i个平方大于N的质数
rep(j,0,m+1) rep(k,0,(1<<c)) { //取j个,含有因子的状态为k
add(f[1][j][k],f[0][j][k]);//不选p[i]的倍数
if(j<m && f[0][j][k])
for(int l=1; p[i]*l<=n; ++l) //取p[i]的l倍
if(!nofree[l] && !(k&s[l])) add(f[1][j+1][k|s[l]],f[0][j][k]);
}
rep(j,0,m+1) rep(k,0,1<<c) f[0][j][k]=f[1][j][k],f[1][j][k]=0;
}
rep(i,0,m) rep(j,0,1<<c) add(f[0][i+1][j],f[0][i][j]);
ll ans=M-1;
rep(i,0,m+1) rep(j,0,1<<c) if(dp[0][i][j])
rep(k,0,1<<c) if(!(k&j))
add(ans,dp[0][i][j]*f[0][m-i][k]%M);
printf("%lld\n",ans);
}
return 0;
}
1010 Just do it (找规律、递推、Lucas、快速幂)
有一个长度为n的整数序列\({a_n}\),对其做m次前缀异或和,求最终的序列。\(1\leq n\leq2\times10^5,1\leq m\leq10^9,0\leq a_i\leq2^{30}-1\)。
法1.
i次变换第j个数是\(f[i][j]\),那么f[i][j]=f[i][j-1]^f[i-1][j](i>0,j>0),a[i]对f[x][y]有贡献当且仅当从f[1][i]走到f[x][y]有奇数条非降路径,也就是C(x-1+y-i,y-i)%2为1。由Lucas定理知C(n,m)%2为1当且经当(n&m)==m。计算出f[m][n],f[m][1..n-1]就是对应错位的a[i]异或起来。当有贡献的a[i]不多时,就不会达到\(O(n^2)\)。
也可以打表找规律。
法2.
既然有递推式f[i][j]=f[i][j-1]^f[i-1][j],那么就可以:
f[i][j]=f[i][j-2]f[i-2][j],...,f[i][j]=f[i-2x][j]f[i-2x][j]。
然后用快速幂的思想做。
#include <bits/stdc++.h>
const int N=200001;
using namespace std;
int t,n,m;
int ans[N],a[N];
int main(){
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&m);
memset(ans,0,sizeof ans);
for(int i=0;i<n;++i)
scanf("%d",a+i);
for(int i=0;i<n;++i)
if(((m-1+i)&i) == i)//第i+1项中a[1]的系数为C(m-1+i,i)
for(int j=i;j<=n;++j)//a[j-i+1]对第j项有贡献
ans[j]^=a[j-i+1];
for(int i=0;i<n;++i)
printf("%d%c",ans[i],i==n-1?'\n':' ');
}
return 0;
}
#include <bits/stdc++.h>
int t,n,m;
int a[200001];
int main(){
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&m);
for(int i=0;i<n;++i)
scanf("%d",a+i);
for(int k=1;m;m>>=1,(k<<=1))
if(m&1)
for(int j=k;j<n;++j)
a[j]^=a[j-k];
for(int i=0;i<n;++i)
printf("%d%c",a[i],i==n-1?'\n':' ');
}
return 0;
}
「2017 Multi-University Training Contest 7」2017多校训练7的更多相关文章
- 「2017 Multi-University Training Contest 8」2017多校训练8
1009 I am your Father! (最小树形图-朱刘算法) 题目链接 HDU6141 I am your Father! 求有向图最大生成树,要求n的父节点尽量小. 我们将所有wi变为-w ...
- 「2017 Multi-University Training Contest 2」2017多校训练2
1001 Is Derek lying 题目链接 HDU6045 Is Derek lying? 给出两个人选择题的回答,问得分分别为x和y是否可能.(\(1\le N \le 80000,0\le ...
- 「2017 Multi-University Training Contest 1」2017多校训练1
1001 Add More Zero(签到题) 题目链接 HDU6033 Add More Zero 找出最大的k,使得\(2^m-1\ge 10^k\). 直接取log,-1可以忽略不计. #inc ...
- 2017 Wuhan University Programming Contest (Online Round) Lost in WHU 矩阵快速幂 一个无向图,求从1出发到达n最多经过T条边的方法数,边可以重复经过,到达n之后不可以再离开。
/** 题目:Lost in WHU 链接:https://oj.ejq.me/problem/26 题意:一个无向图,求从1出发到达n最多经过T条边的方法数,边可以重复经过,到达n之后不可以再离开. ...
- 2017 Wuhan University Programming Contest (Online Round) C. Divide by Six 分析+模拟
/** 题目:C. Divide by Six 链接:https://oj.ejq.me/problem/24 题意:给定一个数,这个数位数达到1e5,可能存在前导0.问为了使这个数是6的倍数,且没有 ...
- 2017 Wuhan University Programming Contest (Online Round) B Color 树形dp求染色方法数
/** 题目:Color 链接:https://oj.ejq.me/problem/23 题意:给定一颗树,将树上的点最多染成m种颜色,有些节点不可以染成某些颜色.相邻节点颜色不同.求染色方法数. 思 ...
- 2017 Wuhan University Programming Contest (Online Round) D. Events,线段树区间更新+最值查询!
D. Events 线段树区间更新查询区间历史最小值,看似很简单的题意写了两天才写出来. 题意:n个数,Q次操作,每次操作对一个区间[l,r]的数同时加上C,然后输出这段区间的历史最小值. 思路:在线 ...
- 2018 Multi-University Training Contest 9 杭电多校第九场 (有坑待补)
咕咕咕了太久 多校博客直接从第三场跳到了第九场orz 见谅见谅(会补的!) 明明最后看下来是dp场 但是硬生生被我们做成了组合数专场…… 听说jls把我们用组合数做的题都用dp来了遍 这里只放了用组 ...
- 2018 Multi-University Training Contest 3 杭电多校第三场
躺了几天 终于记得来填坑了 1001 Ascending Rating (hdoj 6319) 链接:http://acm.hdu.edu.cn/showproblem.php?pid=6319 ...
随机推荐
- 怎么去掉Xcode工程中的某种类型的警告 Implicit conversion loses integer precision: 'NSInteger' (aka 'long') to 'int32
unsigned long numComponents = CGColorGetNumberOfComponents([[UIColor blackColor] CGColor]); 2014年12月 ...
- 《梦断代码》Scott Rosenberg著(二)
书中有一段说的是一个闪烁缺陷——在改变某软件中某个窗体的尺寸时,屏幕会闪烁一秒钟左右.虽然该缺陷不会影响程序运行,但它不符合作者的审美观,历时六个多月仍然没能修正.其实在日常的编程中也有许多小bug的 ...
- No enclosing instance of type is accessible. Must qualify the allocation with an enclosing instance of type LeadRestControllerTest (e.g. x.new A() where x is an instance of ).
java - No enclosing instance is accessible. Must qualify the allocation with an enclosing instance o ...
- Java.lang.OutOfMemoryError:Metaspace
Understand the OutOfMemoryError Exceptionhttps://docs.oracle.com/javase/8/docs/technotes/guides/trou ...
- css 图片文字垂直居中
先来看张图片 相信很多css新手遇到过这种问题,就是当图片和文本显示在一行的时候,效果很奇葩,文字和图片没法对齐, 这时我们需要做的是: 1,先给块级元素设置 display: inline-bloc ...
- Oracle 表空间不足引起的问题及解决方法
-- 1 向数据库导入数据时报了ORA-01653: unable to extend table错误,网上查了下原因是由于表空间不足引起的: 查询表空间使用情况语句 select a.tablesp ...
- Spring中RedirectAttributes的用法
RedirectAttributes 是Spring mvc 3.1版本之后出来的一个功能,专门用于重定向之后还能带参数跳转的的工具类.他有两种带参的方式: 第一种: redirectAttribut ...
- [转帖]windows7/windows NT介绍
windows7/windows NT介绍 原文应该是IT168发布的 但是一直没找到 感觉看了之后 明白了很多 技术都是互相融合的 没有严格意义上的对立直说. Windows 7/Windows ...
- 《Effective C++》设计与声明:条款18-条款25
条款18:让接口容易被正确使用,不容易被误用 注意使用const,explicit,shared_ptr等来限制接口. 必要时可以创建一些新的类型,限制类型操作,束缚对象等. 注意保持接口的一致性,且 ...
- day 7-21 pymysql模块
一.安装的两种方法 第一种: #安装 pip3 install pymysql 第二种: 二.链接,执行sql,关闭(游标) import pymysql user = input("use ...