FWT代码-BZOJ 4589 Hard Nim

题目:给n个不超过m的素数,求xor和=0的方案数,FWT变换裸题。
题目

2关于F逆元的公式: $inv(2)=(F+1)>>1$
证:$ [(F+1)>>1]*2 \pmod F=F+1 \pmod F =1$

代码:


#include<bits/stdc++.h> 
using namespace std;
#define For(i,n) for(int i=1;i<=n;i++)
#define Fork(i,k,n) for(int i=k;i<=n;i++)
#define Rep(i,n) for(int i=0;i<n;i++)
#define ForD(i,n) for(int i=n;i;i--)
#define RepD(i,n) for(int i=n;i>=0;i--)
#define Forp(x) for(int p=pre[x];p;p=next[p])
#define Forpiter(x) for(int &p=iter[x];p;p=next[p])  
#define Lson (o<<1)
#define Rson ((o<<1)+1)
#define MEM(a) memset(a,0,sizeof(a));
#define MEMI(a) memset(a,0x3f,sizeof(a));
#define MEMi(a) memset(a,128,sizeof(a));
#define MEMx(a,b) memset(a,b,sizeof(a));
#define INF (0x3f3f3f3f)
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define vi vector<int> 
#define pi pair<int,int>
#define SI(a) ((a).size())
#define Pr(kcase,ans) printf("Case #%d: %lld\n",kcase,ans);
#define PRi(a,n) For(i,n-1) cout<<a[i]<<' '; cout<<a[n]<<endl;
#define PRi2D(a,n,m) For(i,n) { \
                        For(j,m-1) cout<<a[i][j]<<' ';\
                        cout<<a[i][m]<<endl; \
                        } 
#pragma comment(linker, "/STACK:102400000,102400000")
#define ALL(x) (x).begin(),(x).end()
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
ll F=1000000007LL;
ll iv2=F+1>>1; //Õâ¸ö¼ÆËã˼·ºÃÆÀ 
ll mul(ll a,ll b){return (a*b)%F;}
ll add(ll a,ll b){return (a+b)%F;}
ll sub(ll a,ll b){return ((a-b)%F+F)%F;}
void upd(ll &a,ll b){a=(a%F+b%F)%F;}
inline int read()
{
    int x=0,f=1; char ch=getchar();
    while(!isdigit(ch)) {if (ch=='-') f=-1; ch=getchar();}
    while(isdigit(ch)) { x=x*10+ch-'0'; ch=getchar();}
    return x*f;
} 
void fwt(int*a,int n){
    int i,j,k,x;
    for(k=2;k<=n;k<<=1){
        for(i=0;i<n;i+=k){
            for(j=i;j<i+(k>>1);j++){
                x=a[j]+a[j+(k>>1)];if(x>=F) x-=F;
                a[j]=a[j]-a[j+(k>>1)];if(a[j]<0) a[j]+=F;
                a[j+(k>>1)]=x;
            }
        }
    }
}
void twf(int*a,int n){
    int i,j,k,x;
    for(k=n;k>=2;k>>=1){
        for(i=0;i<n;i+=k){
            for(j=i;j<i+(k>>1);j++){
                x=a[j]+a[j+(k>>1)];
                a[j+(k>>1)]=(int)(1LL*(a[j+(k>>1)]-a[j]+F)*iv2%F);
                a[j]=(int)(1LL*x*iv2%F);
            }
        }
    }
}
ll pow2(ll a,ll b){
    if (!b) return 1%F;
    ll p=pow2(a,b/2);
    p=mul(p,p);
    if (b&1) p=mul(p,a);
    return p;
}
#define MAXN (50000<<3)
int b[MAXN],a[MAXN];
ll n,m;
int main()
{
//  freopen("bzoj4589.in","r",stdin);
//  freopen(".out","w",stdout);

    n=50000;
    MEM(b) b[1]=b[0]=1;
    Fork(i,2,n) if (!b[i]) {
        for(int j=2;i*j<=n;j++)
            b[i*j]=1;
    }   
    while(cin>>n>>m) {
        int len=1;
        while(len<=m) len<<=1;
        Rep(i,len) a[i]=(!b[i])&&(i<=m);
        fwt(a,len);
        Rep(i,len) a[i]=pow2(a[i],n);
        twf(a,len);
        printf("%d\n",a[0]);
    }

    return 0;
}
Posted in FWT

运动会集训

最近--开始了运动会的集训--(有生之年最后一次高中运动会………………の集训)

好吧,这不是重点。。。

说一下这2天的题目:

Day 1:

Relation:

Codeforces Round #320 (Div. 1) [Bayan Thanks-Round] 题解

A.

There is a polyline going through points (0, 0) – (x, x) – (2x, 0) – (3x, x) – (4x, 0) – ... - (2kx, 0) – (2kx + x, x) – ....

We know that the polyline passes through the point (a, b). Find minimum positive value x such that it is true or determine that there is no such x.

题解:所有线的斜率均为\(k=\pm1\)

#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
#define For(i,n) for(int i=1;i< =n;i++) #define Fork(i,k,n) for(int i=k;i<=n;i++) #define Rep(i,n) for(int i=0;i=0;i--)
#define Forp(x) for(int p=pre[x];p;p=next[p])
#define Forpiter(x) for(int &p=iter[x];p;p=next[p])
#define Lson (x< <1) #define Rson ((x<<1)+1) #define MEM(a) memset(a,0,sizeof(a)); #define MEMI(a) memset(a,127,sizeof(a)); #define MEMi(a) memset(a,128,sizeof(a)); #define INF (2139062143) #define eps (1e-10) #define F (100000007) typedef long long ll; typedef double ld; ll mul(ll a,ll b){return (a*b)%F;} ll add(ll a,ll b){return (a+b)%F;} ll sub(ll a,ll b){return (a-b+llabs(a-b)/F*F+F)%F;} void upd(ll &a,ll b){a=(a%F+b%F)%F;} ld a,b; int main() { // freopen("A.in","r",stdin); // freopen(".out","w",stdout); cin>>a>>b;
if (a

B."Or" Game

已知n个数,执行k次操作:将任意一个数乘x,求最大or和

(1 ≤ n ≤ 200 000, 1 ≤ k ≤ 10, 2 ≤ x ≤ 8).

解法:由于 \(x\geqslant2\) 我们应该将位数最大的那个1挪到尽可能高位,因此,应反复乘同一个数

用线段树预处理区间or和,然后枚举执行操作的数即可

#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
#define For(i,n) for(int i=1;i< =n;i++) #define Fork(i,k,n) for(int i=k;i<=n;i++) #define Rep(i,n) for(int i=0;i=0;i--)
#define Forp(x) for(int p=pre[x];p;p=next[p])
#define Forpiter(x) for(int &p=iter[x];p;p=next[p])
#define Lson (x< <1) #define Rson ((x<<1)+1) #define MEM(a) memset(a,0,sizeof(a)); #define MEMI(a) memset(a,127,sizeof(a)); #define MEMi(a) memset(a,128,sizeof(a)); #define INF (2139062143) #define F (100000007) #define MAXN (200000+10) typedef long long ll; ll mul(ll a,ll b){return (a*b)%F;} ll add(ll a,ll b){return (a+b)%F;} ll sub(ll a,ll b){return (a-b+llabs(a-b)/F*F+F)%F;} void upd(ll &a,ll b){a=(a%F+b%F)%F;} ll a[MAXN],x; int n,k; class SegmentTree { ll minv[MAXN*4]; int n; public: SegmentTree(){MEM(minv) } SegmentTree(int _n):n(_n){ MEM(minv) } void mem(int _n) { n=_n; MEM(minv) } void build(int x,int L,int R) { int M=(L+R)>>1;
if (L==R) {minv[x]=a[L];return;}
else
{
if (L< =M) build(Lson,L,M); if (Mql=ql,this->qr=qr;
if (ql>qr) return 0;
return _query_min(1,1,n);
}

ll _query_min(int x,int L,int R)
{
if (ql< =L&&R<=qr) return minv[x]; ll ans=0,M=(L+R)>>1;
if (ql< =M) ans|=_query_min(Lson,L,M); if (M< qr) ans|=_query_min(Rson,M+1,R); return ans; } }S; int main() { // freopen("B.in","r",stdin); // freopen(".out","w",stdout); cin>>n>>k>>x;
For(i,n) scanf("%I64d",&a[i]);
sort(a+1,a+1+n);

S.mem(n);
S.build(1,1,n);

ll e=0;
For(i,n)
{
ll ans=0;
ans|=S.query_min(1,i-1);
ans|=S.query_min(i+1,n);

ll t=a[i];
For(i,k) t*=x;
ans|=t;
e=max(e,ans);
}
cout<

 C .已知序列a1, a2, ..., an (|ai| ≤ 10 000,1 ≤ n ≤ 200 000). 求x,

使序列a1 - x, a2 - x, ..., an - 的子段和的绝对值最小.

解法:二分x,如果最大子段和与最小子段和平均值\(\geqslant 0\),则说明x太大.

#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
#define For(i,n) for(int i=1;i< =n;i++) #define Fork(i,k,n) for(int i=k;i<=n;i++) #define Rep(i,n) for(int i=0;i=0;i--)
#define Forp(x) for(int p=pre[x];p;p=next[p])
#define Forpiter(x) for(int &p=iter[x];p;p=next[p])
#define Lson (x< <1) #define Rson ((x<<1)+1) #define MEM(a) memset(a,0,sizeof(a)); #define MEMI(a) memset(a,127,sizeof(a)); #define MEMi(a) memset(a,128,sizeof(a)); #define INF (2139062143) #define F (100000007) #define eps (1e-8) #define MAXN (200000+10) typedef long long ll; ll mul(ll a,ll b){return (a*b)%F;} ll add(ll a,ll b){return (a+b)%F;} ll sub(ll a,ll b){return (a-b+llabs(a-b)/F*F+F)%F;} void upd(ll &a,ll b){a=(a%F+b%F)%F;} int n; double a[MAXN]; double ans; bool check(double x) { double mins=a[1]-x,maxs=a[1]-x; double t1=0,t2=0; For(i,n) { t1=max(t1+a[i]-x,a[i]-x); maxs=max(maxs,t1); t2=min(t2+a[i]-x,a[i]-x); mins=min(mins,t2); } ans=maxs; return (mins+maxs)/2 <0; } int main() { // freopen("c.in","r",stdin); // freopen(".out","w",stdout); cin>>n;
For(i,n) scanf("%lf",&a[i]);

double l=-2000000000,r=2000000000;
int k=150;
while (k--)
{
double m=(l+r)/2;
if (check(m)) r=m;
else l=m;
}
check((l+r)/2);
printf("%.7lf\n",ans);
return 0;
}

有关PhpMyAdmin,MySQL的学习记录

SELECT * FROM `wp_options` WHERE 1

SELECT `option_id`, `option_name`, `option_value`, `autoload` FROM `wp_options` WHERE 1
INSERT INTO `wp_options`( `option_name`, `option_value`, `autoload`) VALUES (1,2,3)
UPDATE `wp_options` SET `option_id`=[value-1],`option_name`=[value-2],`option_value`=[value-3],`autoload`=[value-4] WHERE 1
UPDATE `wp_options` SET `option_value`=[value-3],`autoload`=[value-4] WHERE 1
WHERE 后为条件
SELECT * FROM `wp_options` WHERE 1
MySQL 关系型数据库
Office Access 管理数据库

主键:
用户 [主:用户ID]
邮箱 [主:邮箱ID]
无主键的表 [用户ID,邮箱ID]

用户 [主:用户ID] ->无主键的表 [用户ID]
邮箱 [主:邮箱ID] ->无主键的表 [邮箱ID]
M方法 :直接把数据库实例化成对象
D方法 :特殊的函数,特殊时间调用
Php : Mysqli

马克飞象 in maxiang.info 语法简要

#x     ##x        ###x        1-3级标题

1.(空格)a

2.(空格)b   有序列表

* a

* b 无序列表

[link](www.baidu.com)   link

``` php

echo 'a';

```    

代码

hellp ` echo 'a' `   单行代码

马克飞象扩展:

1.数学表达式

块:

$$ a+b =1 $$   

行内:

$ a+b = \alpha \beta \delta $

$ \sigma {a^b} ^c _d $

$ \frac{a}{b} \int{adx} $

表格

|aaaa|bbbbb|ccccc|

|:-|:-:|---:|                    左对齐 居中 右对齐 PS这行必须加

|a|b|c|

|a|b|c|

**粗体**

*斜体*

脚注[^demo] 

 

 

部分关于如何在php中使用正则表达式的研究

php:

preg_match ($preg ,$str,$match); 是否匹配到

preg_match_all ($preg ,$str,$match); 匹配数量 $match可以不加

var_dump ( $match );

$preg='\a\'; a为正则表达式

\w 一个字符 \d 一个数字 \s空格回车

\W \D \S 前面取补集

[A-Z] 区间

[^A-Z] 区间取补集

\w|\d |或运算

^x 强制匹配行首

x$ 强制匹配行尾 (最多匹配1次)

\d{4} 匹配连续出现4次 (‘1234’,‘2222’)

\d(i,j) 匹配连续出现i到j次

\d? 0<=k<=1 <-匹配次数 \d+ k>=1

\d* k>=0

\\1 表示本次匹配中第一个出现的()中的内容

*? 匹配尽可能短

线段树开多大好?[学术向]

我们线段树向来是开4*n的。

我们来看看2*n行不行……答案是不行。

原因:线段树有2*n-1个节点(满二叉树),但是实际情况时中间会有很多空结点(玩指针的无视这句话)

所以2*n妥妥不够。

3*n行不行?貌似不行……(求反例……)

总而言之,还是开到4*n吧。

LA 5916(GCD Guessing Game-质数分组)

现在有一个数x,1 ≤ x≤ n,告诉你n,每次你可以猜一个数y,如果x==y则结束,否则返回gcd(x,y),问最少只要几次就可以保证猜出答案。

Input 

The input file contains several test cases, each of them as described below.

The input contains one integer n2$ \le$n$ \le$10000.

Output

For each test case, write to the output on a line by itself.

Output one integer -- the number of guesses Andrew will need to make in the worst case.

 

Sample Input

6

 

Sample Output

2

首先把所有n以内素分组,每次询问一组素数的积——根据Gcd的性质确定这个数

每次贪心拿一个大质数与一堆小质数配(最右*最左)

 

#include
#include
#include
#include
#include
#include
#include
using namespace std;
#define MAXN (10000)
#define eps (1e-9)
#define For(i,n) for(int i=1;i< =n;i++) #define ForD(i,n) for(int i=n;i;i--) #define Fork(i,k,n) for(int i=k;i<=n;i++) int n,a[MAXN],size=0; bool b[MAXN]; int main() { memset(b,0,sizeof(b));b[1]=1; Fork(i,2,MAXN) { if (!b[i]) b[i]=1,a[++size]=i; For(j,size) { if (i*a[j]>MAXN) break;
b[i*a[j]]=1;
if (!i%a[j]) break;
}
}
// For(i,100) cout< >n)
{
int i=0,head=1,tail=size;
while (a[tail]>n) tail--;
while (head< =tail) { int p=a[tail]; while (p*a[head]<=n) p*=a[head++]; tail--;i++; } cout<

 

BZOJ 1013([JSOI2008]球形空间产生器sphere-gauss消元练习)

1013: [JSOI2008]球形空间产生器sphere

Time Limit: 1 Sec  Memory Limit: 162 MB

Submit: 1181  Solved: 654

[Submit][Status][Discuss]

Description

有一个球形空间产生器能够在n维空间中产生一个坚硬的球体。现在,你被困在了这个n维球体中,你只知道球面上n+1个点的坐标,你需要以最快的速度确定这个n维球体的球心坐标,以便于摧毁这个球形空间产生器。

Input

第一行是一个整数,n。 接下来的n+1行,每行有n个实数,表示球面上一点的n维坐标。每一个实数精确到小数点后6位,且其绝对值都不超过20000。

Output

有且只有一行,依次给出球心的n维坐标(n个实数),两个实数之间用一个空格隔开。每个实数精确到小数点后3位。数据保证有解。你的答案必须和标准输出一模一样才能够得分。

Sample Input

2
0.0 0.0
-1.0 1.0
1.0 0.0

Sample Output

0.500 1.500

数据规模:
对于40%的数据,1<=n<=3
对于100%的数据,1<=n<=10
提示:给出两个定义:
1、 球心:到球面上任意一点距离都相等的点。
2、 距离:设两个n为空间上的点A, B的坐标为(a1, a2, …, an), (b1, b2, …, bn),则AB的距离定义为:dist = sqrt( (a1-b1)^2 + (a2-b2)^2 + … + (an-bn)^2 )

 

高斯消元

显然可以消成Σ(pi-qi)xi=1/2*Σ(pi^2-qi^2)

#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
#define MAXN (10+10)
#define MAXAi (20000)
#define eps (0.0000001)
#define For(i,n) for(int i=1;i< =n;i++) double sqr(double x){return x*x;} int n; double a[MAXN][MAXN],f[MAXN][MAXN]={0.0}; int gauss() { For(i,n) { if (abs(f[i][i])abs(f[p][i])) j=p;
swap(f[p],f[i]);//Waiting for change
}
if (abs(f[i][i])>n;
For(i,n+1) For(j,n) cin>>a[i][j];
For(i,n) For(j,n) f[i][j]=a[i][j]-a[i+1][j],f[i][n+1]+=sqr(a[i][j])-sqr(a[i+1][j]);
For(i,n) f[i][n+1]/=2;
/*
For(i,n)
{
For(j,n+1) cout<

你能看得出这些问题共同的做法吗?1

Program 1:

Just The Mice NBUT1312

nbut1312把肉和老鼠分开,至少要描几条(网格)线?

Program 2:

k-road Prob

K-road从A点到B点走k次,每次只能向左,下,假定每个格子上都有一个整数,问能走过的最大的数的和是多少?

Program 3:

k-road Prob 2

K-road从A点到B点走k次,每次只能向左,下,假定每个格子上都有一个整数,问能走过的最大的数的积是多少?

Program 4

Catching Curl

bzoj1001这图相信大家都见过了XD……题目略