10/26测试
- 该来的总会来,该走的也无法挽留。
比如毕姥爷的神奇考试题 摊平/ 今下午简直是意识流做题 允悲
蓝鹅虽然题目极为鬼畜,还是有大佬拿了250%%%%%%%
目录
T1 没有君子,不养艺人
每次做毕姥爷的题就超想吐槽他的第一句话嗯……
看到题就是十分懵逼,高斯整数是什么鬼?意识流回想了一下,没啥头绪就跳过了
然后把T2解决了看时间还充裕再回来做的
先暴力打表枚举了一下p的幂,然后发现,我们一定可以把x和y的二进制位从低到高依次调整成0。
每次右移,然后判断最后一位的奇偶,这题可以每次/p,然后判断实部和虚部的和的奇偶。
因为高斯整数一定能表示成−1±i进制的形式,摊手/
B君给的题解(简明的一句话题解)是:
给个题目参考资料:复数进制 嗯,B君出题灵感的罪恶来源
代码:(用的是complex类瞎搞的)
#pragma GCC optimize (2)
#include<bits/stdc++.h>
#define LL long long
using namespace std;
//瞎搞一波
const int maxn=1000+10;
LL x,y;
int ans[maxn];
complex<LL >n,p,cplx;
int read()
{
char c=getchar();int x=0,f=1;
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
return x*f;
}
int main()
{
int cnt=0,res=0;
scanf("%lld%lld",&x,&y);
n=complex<LL >(x,y);
p=complex<LL >(-1,-1);
while(n!=complex<LL >(0,0))
{
if((n.real()+n.imag())%2!=0)
{
ans[++cnt]=res;
n-=complex<LL >(1,0);//
}
//printf("real:%lld imag:%lld\n",n.real(),n.imag()) ;
n/=p;
res++;
}
printf("%d\n",cnt);
for(int i=1;i<=cnt;i++)
{
printf("%d\n",ans[i]);
}
return 0;
}
%毕姥爷的代码QAQ:
#include <bits/stdc++.h>
using namespace std;
long long x, y;
int a[200], c, i;
int main() {
cin >> x >> y;
while (x != 0 || y != 0) {
if ((x + y) & 1) {
a[c++] = i;
x--;
}
// (x + yi) * (-1 + i) / 2
// (-x -y, x - y) / 2
long long nx = (-x - y) / 2;
long long ny = (x - y) / 2;
x = nx;
y = ny;
i++;
}
printf("%d\n", c);
for (int i = 0; i < c; i++) {
printf("%d\n", a[i]);
}
return 0;
}
T2雷霆雨露,俱是天恩
又是毫无头绪的一道题 给自己鼓掌/太菜了
发了一会儿呆就开始猜结论,各种瞎蒙,最后发现是求数列的非升子序列???
于是怀着忐忑的心情就开始瞎写了,心想万一碰对了呢?
用的树状数组,然后信仰一交,最后发现有五十分~鼓掌鼓掌,太不容易了我
不过神奇的是如果用define mod 就会得到一个神奇的答案???一脸懵逼
#pragma GCC optimize (2)
#include<cstdio>
#include<cstring>
#include<iostream>
#include<cstdlib>
#include<vector>
#include<queue>
#include<stack>
#include<algorithm>
#include<deque>
#include<cmath>
#include<cctype>
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
using namespace std;
const int maxn=250000+7;
const int mod=1000000000+7;
int n,m;
int tree[maxn];
int a[maxn],b[maxn];
int read()
{
char c=getchar();int x=0,f=1;
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
return x*f;
}
bool cmp(int a,int b)
{
return a<b;
}
int getrnk(int x)
{
return lower_bound(b+1,b+n+1,x)-b;
}
struct TRAR
{
int lowbit(int x)
{
return x&(-x);
}
void add(int x,int value)
{
for(int i=x;i<=n+1;i+=lowbit(i))
{
(tree[i]+=value)%=mod;
}
}
int getsum(int x)
{
int sum=0;
for(int i=x;i;i-=lowbit(i))
{
(sum+=tree[i])%=mod;
}
return sum;
}
}T;
int main()
{
n=read();
for(int i=1;i<=n;i++)
{
b[i]=a[i]=read();
}
sort(b+1,b+n+1,cmp);
T.add(n+1,1);
for(int i=1;i<=n;i++)
{
int pos=getrnk(a[i]);
T.add(pos,(T.getsum(n+1)-T.getsum(pos-1)+mod)%mod);
}
//for(int i=1;i<=n+1;i++) printf("%d ",tree[i]);
int ans=(T.getsum(n)-n+mod)%mod;
printf("%d\n",ans);
return 0;
}
至于为什么只有五十,因为还需要组合数中没有2333的倍数,所以实际上只得了ai≤2333的部分分,可喜可贺。
正解是二维的树状数组,用到了定理;
因为对于,所以表示成2333进制最多有2位,然后就信仰瞎搞吧
#pragma GCC optimize (2)
#include<bits/stdc++.h>
#define LL long long
using namespace std;
const int maxn=2333;
const int INF=0x7fffffff;
const int mod=1000000000+7;
int n;
int tree[maxn+7][maxn+7];
int read()
{
char c=getchar();int x=0,f=1;
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
return x*f;
}
struct TRAR
{
int lowbit(int x)
{
return x&(-x);
}
void add(int x,int y,int value)
{
for(int i=x;i<=maxn;i+=lowbit(i))
{
for(int j=y;j<=maxn;j+=lowbit(j))
{
(tree[i][j]+=value) %= mod;
}
}
}
int getsum(int x,int y)
{
int res=0;
for(int i=x;i;i-=lowbit(i))
{
for(int j=y;j;j-=lowbit(j))
{
(res += tree[i][j]) %= mod;
}
}
return res;
}
}T;
int main()
{
n=read();
int ans=0;
while(n--)
{
int x,y;
x=read();
y=maxn-x%maxn; x=maxn-x/maxn;
int t=T.getsum(x,y);
(ans+=t)%=mod;
T.add(x,y,t+1);
}
printf("%d\n",ans);
return 0;
}
题目灵感:二进制,枚举子集的一个版本
T3既食君禄,替君分忧
emmmmm不会做的一道题;
不过想通了就好理解√
动态规划:
表示只考虑点集
中的边,使得点集
连通的方案数;
表示把点集
划分成
个集合的方案数。
B君的标程↓↓↓:
#include <bits/stdc++.h>
using namespace std;
int p = 1000000007;
int n, m, k;
int b[1020], c[65537], f[17][65537];
int main() {
scanf("%d%d%d", &n, &m, &k);
for (int i = 0; i < m; i++) {
int x, y;
scanf("%d%d", &x, &y);
x--;
y--;
c[(1 << x) | (1 << y)]++;
}
for (int i = b[0] = 1; i < 1010; i++) {
b[i] = b[i - 1] * 2 % p;
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < 1 << n; j++) {
if (j >> i & 1) {
c[j] += c[j ^ (1 << i)];
}
}
}
for (int i = 1; i < 1 << n; i++) {
int ii = i & (i - 1);
int t = 0;
for (int j = ii; j > 0; j = (j - 1) & ii) {
t = (t + (long long)f[1][i ^ j] * b[c[j]]) % p;
}
f[1][i] = (b[c[i]] - t + p) % p;
}
for (int i = 2; i <= k; i++) {
for (int j = 1; j < 1 << n; j++) {
int jj = j & (j - 1);
for (int k = jj; k > 0; k = (k - 1) & jj) {
f[i][j] = (f[i][j] + (long long)f[i - 1][k] * f[1][j ^ k]) % p;
}
}
}
printf("%d\n", f[k][(1 << n) - 1]);
return 0;
}
总体来说今天考试发挥一般化QAQ,全程意识流做题。