qx的博客

博客

扩域

2024-04-19 19:31:51 By qx

提供一个可以处理无理数的黑科技。

定义新的虚数单位 i,i=5.

对于 fib 数列的通项公式:

Fn=15[(1+52)n(152)n]

5 视作虚数单位。原式可化为:

Fn=1i[(1+i2)n(1i2)n]

需要注意: i2=52=5.

zz=(a+bi)(c+di)=ac+(ad+bc)i+bdi2=ac+5bd+(ad+bc)i

答案是其实数部分。

#include <bits/stdc++.h>
#define ll long long
#define int long long
using namespace std;
ll p=1e9+7;
struct cplx{
    ll a,b;
    cplx(ll A=0,ll B=0): a(A), b(B) {}
    cplx operator +(const cplx& tt)const{
        ll u=a+tt.a,v=b+tt.b;
        return cplx(u%p,v%p);
    }
    cplx operator -(const cplx& tt)const{
        ll u=a-tt.a+p,v=b-tt.b+p;
        return cplx(u%p,v%p);
    }
    cplx operator *(const cplx& tt)const{
        ll u=a*tt.a+5*b*tt.b,v=a*tt.b+b*tt.a;
        return cplx(u%p,v%p);
    }
}; 
ll qpow(int a,int b){
    ll base=a,res=1;
    while(b){
        if(b&1)  res=res*base%p;
        base=base*base%p, b>>=1;
    }
    return res;
}
cplx Qpow(cplx a,int b){
    cplx base=a,res=cplx(1,0);
    while(b){
        if(b&1)  res=res*base;
        base=base*base, b>>=1;
    }
    return res;
}
signed main(){
    ll n; cin>>n;
    ll inv2=qpow(2,p-2);
    cplx x=cplx(inv2,inv2);
    cplx y=cplx(inv2,p-inv2);
    cplx xx=Qpow(x,n),yy=Qpow(y,n);
    cplx res=xx-yy;
    ll ans=res.b;
    printf("%lld\n",ans%p);
}

性质 P

2024-03-09 13:08:00 By qx

整数 n ,如果存在整数 x,y,z 满足 n=x3+y3+z33xyz ,则称 n 具有性质 P,在 1,5,2013,2024 中,那些数具有性质 P,那些数不具有性质 P?请说明理由。

题外话

问题并非我所解决,是由同学解决的。

下面的话语是我的胡言乱语,并不能当作可以获得满分的正确解答。

被同学嘲讽了。不过貌似确实很简单的样子。

在此膜拜一下。顺手写一篇解。

解:

原式

=(x+y+z)(x2+y2+z2xyzxzy)

=(x+y+z)[(x2+y2+z2+2xy+2xz+2yz)3xy3xz3yz]

=(x+y+z)[(x+y+z)23(xyxzyz)]

a=x+y+z,b=xyxzyz.

a,b 均为整数。

原式 =a(a23b)

\therefore a,(a^2+3b) 必有一是 3 的倍数。

分类讨论如下:

\color{white}{ }

1 ^{\circ} 3|a,3|a^2.

\therefore 3|a^2-3b

3 \nmid (a^2-3b). 并不存在满足条件的 a,b.

\color{white}{ }

2 ^{\circ} 3|a^2,3|a^2-3b, 3|a.

3 \nmid a. 并不存在满足条件的 a,b.

\color{white}{ }

综上所述,没有满足条件的 a,b,c ,故 2013 不具有性质 P

1x=1,y=0,z=0 时可以使原式成立,故满足性质 P.

5x=1,y=2,z=2 时可以使原式成立,故满足性质 P.

2024x=674,y=675,z=675 时可以使原式成立,故满足性质 P.


另外三数

也许你很想知道另外三个数我是如何得出来的。因为一次一次像证明无解一样做太过冗长。提供一种快速的凑数方法。

先给一张表吧。

1 1 1 -> 0
1 1 2 -> 4
1 2 2 -> 5
2 2 2 -> 0
2 2 3 -> 7
2 3 3 -> 8
3 3 3 -> 0
3 3 4 -> 10
3 4 4 -> 11
4 4 4 -> 0
4 4 5 -> 13
4 5 5 -> 14
5 5 5 -> 0
5 5 6 -> 16
5 6 6 -> 17
6 6 6 -> 0

左边三个数是 x,y,z ,右边是代入原式之后的值。

可以看见,x=y=z 时原式 =0.

但是如果有一个数增加 1 会变成如下形式:

(x+1)^3 + x^3 + x^3 - 3(x+1)x^2 = 3x+1

两个数增加 1 会变成如下形式:

(x+1)^3 + (x+1)^3 + x^3 - 3(x+1)^2x = 3x+2

由于另外三个数都不是 3 的倍数,所以代入这两个式子进去马上就可以求出答案。甩出来就是满足条件的 x,x+1.

当然,如果你偏爱真相的话还是可以用正解作答的。在这里只不过是提供一种用谎言骗取考试时间的方法罢了。总之。

\texttt{solved}

补充说明

警告: 下面含有大量胡言乱语。但是我相信你一定会看得懂的。

应邱老追问。补充一段分类讨论之中的证明。

a 是整数,a^2 的每一个质因子出现个数都是 a 中出现的两倍。这个是幂的运算部分。不多阐述。而 a^2 由于 a 是整数,所以每一个质因子都至少出现了两次。那么在 a=\sqrt{a^2} 中每一个质因子出现次数都会减去一半,但是最后还是多于一次。

这样的话 a 出现的因子和 a^2 是一样的。

所以说 3|a \iff 3|a^23b 由于 b 是整数也一定会含有一个因子 3 两个数相加后一定也会有一个因子 3 。这是乘法分配律。

如果你需要详细的解释那么我想应该是下面这样的:

a=3k,则 a+3b=3k+3b=3(k+b)k,b 同样是整数所以加和同样也是整数。乘上 3 之后当然就会有一个因子是 3

你可能还很想知道为什么在 2013 的不具性质 P 的证明中, a,(a^2+3b) 为什么必定会有一个含有因子 3 吧?

那么我来告诉你。如果两个数都不含有因子 3 的话,那么随之它们的乘积 2013 也不应该会含有因子 3.2010 一样,这些 3 的倍数无论拆分成哪两个因子想成最终都仍然会有一个含有因子 3.

这个可以通过代数基本定理证明吧。但是我累了不想写了。如果不能证明的话那就说明我又开始胡思乱想了。虽然这句话本身就是胡言乱语的一部分。

a+b problem 题解

2024-01-31 23:40:19 By qx

先把一个单项式理解为:

符号,系数的绝对值,字母,指数。

为了方便操作,一口气读完整个字符串(数组),然后去扫描。

因为如果第一项为整数的话没有符号,判一判。

读入系数的绝对值像快读。

如果有 \texttt{^} 这个符号,读一下之后的指数。

由于只有三个字母,所以可以复制粘贴,不用写冗余的 \texttt{for} 循环。代码如下:

inline void change(polygon &a,char *s1){
    int l1=strlen(s1+1);
    for(int i=1;i<=l1;){
        int fl=1,x=0;
        d w1=nw,w2=nw,w3=nw;
        if(s1[i]=='+'||s1[i]=='-') fl=(s1[i]=='+'?1:-1),++i;
        while(isdigit(s1[i])) x=x*10+(s1[i]-'0'),++i;
        if(s1[i]=='x') w1.alpha=s1[i],++i;
        if(s1[i]=='^') ++i;
        while(isdigit(s1[i])) w1.digit=w1.digit*10+(s1[i]-'0'),++i; 
        w1.digit=!w1.digit?w1.alpha=='x':w1.digit;
        if(s1[i]=='y') w2.alpha=s1[i],++i;
        if(s1[i]=='^') ++i;
        while(isdigit(s1[i])) w2.digit=w2.digit*10+(s1[i]-'0'),++i; 
        w2.digit=!w2.digit?w2.alpha=='y':w2.digit;
        if(s1[i]=='z') w3.alpha=s1[i],++i;
        if(s1[i]=='^') ++i;
        while(isdigit(s1[i])) w3.digit=w3.digit*10+(s1[i]-'0'),++i; 
        w3.digit=!w3.digit?w3.alpha=='z':w3.digit;
        if(w1.alpha=='x'||w2.alpha=='y'||w3.alpha=='z') 
            a.x[{w1.digit,w2.digit,w3.digit}]+=fl*x;
        else a.q+=fl*x;
    }
}

然后考虑存储,约定一个结构体 str ,存储三个 \texttt{int} 变量 x,y,z 的质数。然后放进 \texttt{map} 里。映射项的系数。记得按照约定重载小于运算符。

定义一个多项式结构体,由一个 \texttt{map} 以及一个存储多项式常数的整型组成。

struct str{ 
    int x,y,z; 
    bool operator < (const str b) const{
        if(x+y+z!=b.x+b.y+b.z) return x+y+z>b.x+b.y+b.z;
        if(x!=b.x) return x>b.x;
        if(y!=b.y) return y>b.y;
        return z>b.z;
    }
};
struct polygon{    map<str,int> x; int q; }a,b,c;

表示 A,B,A+B.

合并同类项就扫一遍两个 \texttt{map} ,然后让新的 A+B 的每一项系数加上原来的系数。

inline void add(void){
    for(auto it:a.x) c.x[{it.first.x,it.first.y,it.first.z}]+=it.second;
    for(auto it:b.x) c.x[{it.first.x,it.first.y,it.first.z}]+=it.second;
    c.q=a.q+b.q;
}

然后按要求输出,这一步多加小心。\texttt{cbh} 可是很毒瘤的。

inline void output(polygon x){
    bool fl=0;
    for(auto it:x.x){
        if(!it.second) continue;
        if(it.second>0&&fl) printf("+");
        if(it.second==-1) printf("-");
        if(it.second!=1&&it.second!=-1) printf("%d",it.second);
        if(it.first.x==1) printf("x");
        if(it.first.x>1) printf("x^%d",it.first.x); 
        if(it.first.y==1) printf("y");
        if(it.first.y>1) printf("y^%d",it.first.y); 
        if(it.first.z==1) printf("z");
        if(it.first.z>1) printf("z^%d",it.first.z); 
        fl=1;
    }
    if(x.q){
        if(x.q>0&&fl) printf("+");
        printf("%d",x.q);
        fl=1;
    }
    if(!fl) printf("0");
    return puts(""),void();
}

加试复习最后一题 讨论爆算

2024-01-13 20:43:03 By qx

是否存在正整数组 (x,y,z),使 10(xy+yz+zx)=9xyz 成立?若存在,求出所有正整数组 (x,y,z);若不存在,请说明理由。

\because 10(xy+yz+zx)=9xyz

\therefore 10xy+10yz+10zx=9xyz

\therefore 10 \times \dfrac{1}{x} +10 \times \dfrac{1}{y} +10 \times \dfrac{1}{z} =9

\therefore \dfrac{1}{x}+\dfrac{1}{y}+\dfrac{1}{z}=\dfrac{9}{10}

不妨设 x \leq y \leq z.

\because x,y,z>0

\therefore x,y,z>1

\dfrac{1}{x} \geq \dfrac{1}{y} \geq \dfrac{1}{z}, \dfrac{1}{x} \geq \dfrac{3}{10}.

\therefore x<4.

分类讨论如下:

1^\circ \, x=2: 代入原式,得

\dfrac{1}{2}+\dfrac{1}{y}+\dfrac{1}{z}=\dfrac{9}{10}

\dfrac{1}{y}+\dfrac{1}{z}=\dfrac{2}{5}

\dfrac{1}{y} \geq \dfrac{1}{5}.

\therefore 1 < y \leq 5.

\text{I.} \quad y=2: 代入上式解得 z=-10. (舍)

\text{II.} \quad y=3: 代入上式解得 z=15. (\sqrt{})

\text{III.} \quad y=4: 代入上式解得 z=\dfrac{20}{3}.(舍)

\text{IIII.} \quad y=5: 代入上式解得 z=5.(\sqrt{})

2^\circ \, x=3: 代入原式,得

\dfrac{1}{3}+\dfrac{1}{y}+\dfrac{1}{z}=\dfrac{9}{10}

\dfrac{1}{y}+\dfrac{1}{z}=\dfrac{17}{30}

\dfrac{1}{y} \geq \dfrac{17}{60}

\therefore 3 \leq y<4.y=3: 代入上式解得 z=\dfrac{30}{7}. (舍)

综上所述,(x,y,z)=(2,2,5),(2,5,2),(5,2,2),(2,3,15),(2,15,3),(3,2,15),(3,15,2),(15,2,3),(15,3,2).

problems

2024-01-12 22:27:53 By qx

圆内任取三点其构成三角形覆盖圆心的概率

设三个点分别为 P_1, P_2, P_3.,圆上有 x 个点 .x 理论来说是无限大的,但是因为方便表述,所以使用 x 代替之)

任选三个点,共有 x^3 种方案。

概率为 \dfrac{y}{x^3}。其中 y 表示圆内任取三点其构成三角形覆盖圆心的方案数。

作射线 P_1 OP_2 O. 两条射线与圆周的交点分别为 Q_1,Q_2.

显然,若确定 P_1,P_2 ,则满足题意的点 P_3 一定在 P_1 O\overset{\huge{\frown}}{Q_1 Q_2} 上。(原因不想写,让我写也可以试试看)

如图所示。

图炸了关我啥事

选择 P_3 的方案数是 2 \left[\dfrac{\alpha}{360} \times x \right] .2 \left[ \overset{\huge{\frown}}{Q_1 Q_2} \right]. 对顶角相等,也即 2 \left[\overset{\huge{\frown}}{P_1 P_2} \right].

则总方案数为

\begin{aligned} y & = 2\left[ \sum _{P_1=1} ^x \sum _{P_2=1} ^{\dfrac{x}{2}} \overset{\huge {\frown}}{P_1 P_2} \right]\\ & = 2\left[ \sum _{i=1} ^x \sum _{j=1} ^{\dfrac{x}{2}} j \right] \\ & = 2\left[ \sum _{i=1} ^x \sum _{j=1} ^{\dfrac{x}{2}} j \right] \\ & = 2\left\{ \sum _{i=1} ^x \left[ \dfrac{\frac{x}{2}(\frac{x}{2}+1)}{2} \right] \right\}\\ & = 2x \left[ \dfrac{\frac{x}{2}(\frac{x}{2}+1)}{2} \right] \end{aligned}

这里认为 x 是无穷的,则 y = \dfrac{x^3}{4}.

代入 \dfrac{y}{x^3} ,得到 概率为 \dfrac{\dfrac{x^3}{4}}{x^3}=\frac{1}{4}.

qx Avatar