kuangbin专题 数论基础 part1?

线段树专题太难了,那我来作数学吧!ios

但数学太难了,我......(扯c++

 

这两天想了作了查了整理了几道数学。算法

除了一些进阶的知识,像莫比乌斯反演,杜教筛,min25学不会我跳了,一些基础的思惟仍是能够记录一下。数组

 

ex_gcd ide

POJ 1061 青蛙的约会
POJ 2115 C Looooops函数

SGU 106 The equationoop

三连击。spa

谈谈理解吧,原理我没懂 (扯.net

就是经过exgcd求出来的gcd(a,b)=d,而c%d!=0说明无解。debug

再将a,b,c分别除以公约数d。 a/=d,b/=d,c/=d;

exgcd出来x=1,  x*=c就是一个特解。其中x的最小正解(这里包括0)是 (x%b+b)%b;  此时的y能够相应用 y=(c-a*x)/b 反过来求解获得。

同理 y的最小正解相应可获得,y*=c 再 (y%a+a)%a;

这里要特别注意尽可能让a,b初始都是正的,并且特别注意要保证 ax+by=c这样的式子的形式,特别是c的位置,c负的不要紧。

通解就能够经过特解加 任意个单位  ,好比 x=x0+b*k;  y=y0-a*k;   

什么什么解系?我线代忘啦(哭

 

而后SGU 106 注意若是每一个参数负的,对应算出来的k区间要swap一下。由于你看那个负号在分母上呀。

还要用到ceil 和floor   。一直以来讲精度偏差,我都不想用这个函数,后来仍是屈服了。

 

 

UVA 11752 The Super Powers

这题我思惟呀,虽然我岔了。手玩一下,发现指数为合数就能成为答案。

而后我一开始想用优先队列!对素数的合数次幂加入答案。而后就没了,WA了好一阵子。

其实合数的合数次幂也存在答案啊,好比6^4,能够搞成6^(2*2 || 1*4) 而且这个是前面没出现的!因此啊 要处理全部的数的答案。用set维护,不能用优先队列了。

判溢出的细节

这我没想到啊,题目是ull,一直想根据负数或者数变小了来判,难搞的很。

仍是看了题解才知道,用ull的上限,每次除这个数,预处理出每一个数最多的指数的次幂,最多指数次幂都小于4(最小的合数)了,就break掉。

别头铁判溢出啊,反过来处理最多指数到几,这就颇有灵性对吧。(我没有...

 

LightOJ 1370 Bi-shoe and Phi-shoe

POJ 2478 Farey Sequence

两个欧拉筛,我几个月的进步就是把我模板的筛从log升级到线性了红红火火恍恍惚惚。线性的还好理解,但min25和杜教目前必不可能懂555.

 

UVA 11426 GCD - Extreme (II)

这题好经典啊感受。我只能想到预处理欧拉函数,对每一个i 根号n的去找因数 那n^3/2就没了啊。

 

而后又发现了新大陆思惟,对每一个数去找因数,是很差找的一个过程,但你对每一个因数去算他对别的数产生的贡献是很好搞的!

再有一个gcd的公式  我要对每一个n找知足x与n 的gcd为i的个数,gcd(n,x)=i  ,gcd(n/i,x/i)=1;  这不是phi[n/i]! 每一个因数的贡献就转化为了  i*phi[n/i]

而后就有了对因数1,2,3,4,5......  去加贡献    n+n/2+n/3+n/4+n/5+.....+1+....+0这个总复杂度咋算啊,md我竟然不会,反正比上面的优秀多了

 

还有,既能够像我注释里同样,统计sum【i】,O(1)回答,这样预处理的复杂度就为上面那个式子;大概500ms;

还查到了别人对欧拉函数求了前缀和,而后直接对每一个数O(n)统计,这个须要理解一下。只用200ms左右;

 

 1 #include <bits/stdc++.h>
 2 #define debug(x) cout << #x << ": " << x << endl
 3 using namespace std;
 4 typedef long long ll;
 5 const int INF=0x3f3f3f3f;
 6 const int MOD=1e9+7;
 7 
 8 
 9 const int MAXN=4e6+7;
10 
11 bool notprime[MAXN];
12 //ll sum[MAXN];
13 //ll b[MAXN];
14 ll prime[MAXN/10];
15 ll phi[MAXN];
16 int cnt;
17 
18 void getprime_phi()
19 {
20     cnt = 0;
21     phi[1] = 1;
22     notprime[0]=notprime[1]=1;
23     for(int i = 2;i < MAXN;i++)
24     {
25         if(!notprime[i])
26         {
27             prime[cnt++] = i;
28             phi[i] = i-1;
29         }
30         for(int j = 0;j < cnt && i * prime[j] < MAXN;j++)
31         {
32             notprime[i*prime[j]] = 1;
33             if(i%prime[j]==0)
34             {
35                 phi[i*prime[j]] = phi[i]*prime[j];
36                 break;
37             }
38             phi[i*prime[j]] = phi[i]*(prime[j]-1);
39         }
40     }
41     for(int i=2;i<MAXN;++i) phi[i]+=phi[i-1];
42 }
43 
44 int main()
45 {
46     getprime_phi();
47     /*for(int i=1;i<MAXN;++i)
48     {
49         for(int j=i*2;j<MAXN;j+=i)
50         {
51             b[j]+=1ll*phi[j/i]*i;
52         }
53     }
54 
55     for(int i=2;i<MAXN;++i)
56         sum[i]=sum[i-1]+b[i];*/
57     int n;
58     while(~scanf("%d",&n))
59     {
60         if(!n) break;
61        // printf("%lld\n",sum[n]);
62         ll ans=0;
63         for(int i=1;i<=n;++i) ans+=1ll*(phi[n/i]-1)*i;
64         printf("%lld\n",ans);
65     }
66     return 0;
67 }
View Code

 

POJ 2116 Death to Binary?

模拟题

将计算字符串的值  和 值转化字符串 封装成函数。

仍是string好用,对未赋值的string,不能经过下标访问,但能够用+=,直接粘在后面,贼棒,我一开始用char 数组,好难搞的啊。

而后我这题没注意到输入能够为0,没测,而后出现了output limit exceed!活久见。而后发现本身原来的转化写假了,没特判0。就会输出贼多0,就没了,竟然不是WA而是。

 

#include <string>
#include <iostream>
#include <algorithm>
#include <cstring>

#define debug(x) cout << #x << ": " << x << endl
using namespace std;
typedef long long ll;
const int MAXN=100;
const int INF=0x3f3f3f3f;
const int MOD=1e9+7;

ll f[60];
void init()
{
    f[0]=1;f[1]=2;
    for(int i=2;i<50;++i) f[i]=f[i-2]+f[i-1];
}

string s,t,ss,tt,goa;

ll cal(string &str)
{
    ll res=0;
    int len=str.size();
    for(int i=0;i<len;++i)
    {
        if(str[i]=='1') res+=f[len-i-1];
    }
    return res;
}

void standard(string &tmp, ll val)
{
    tmp="";
    for(int i=40;i>=0;--i)
    {
        if(val>=f[i])
        {
            val-=f[i];
            tmp+='1';
        }
        else if(tmp!="")
        {
            tmp+='0';
        }
    }
    if(tmp=="") tmp="0";
}

int main()
{
    init();
    while(cin>>s>>t)
    {
        ll anss=cal(s);
        standard(ss,anss);

        ll anst=cal(t);
        standard(tt,anst);

        ll ans=anss+anst;
        //debug(ans);
        standard(goa,ans);
        int len=goa.size();
        int lens=ss.size();
        int lent=tt.size();

        for(int i=0;i<len+2-lens;++i) cout<<' ';
        cout<<ss<<'\n';
        cout<<"+ ";
        for(int i=0;i<len-lent;++i) cout<<' ';
        cout<<tt<<'\n';
        cout<<"  ";
        for(int i=0;i<len;++i) cout<<'-';
        cout<<'\n';
        cout<<"  "<<goa<<'\n'<<'\n';
    }
    return 0;
}

#include <string>
#include <iostream>
#include <algorithm>
#include <cstring>

#define debug(x) cout << #x << ": " << x << endl
using namespace std;
typedef long long ll;
const int MAXN=100;
const int INF=0x3f3f3f3f;
const int MOD=1e9+7;

ll f[60];
void init()
{
    f[0]=1;f[1]=2;
    for(int i=2;i<50;++i) f[i]=f[i-2]+f[i-1];
}

string s,t,ss,tt,goa;

ll cal(string &str)
{
    ll res=0;
    int len=str.size();
    for(int i=0;i<len;++i)
    {
        if(str[i]=='1') res+=f[len-i-1];
    }
    return res;
}

void standard(string &tmp, ll val)
{
    tmp="";
    for(int i=40;i>=0;--i)
    {
        if(val>=f[i])
        {
            val-=f[i];
            tmp+='1';
        }
        else if(tmp!="")
        {
            tmp+='0';
        }
    }
    if(tmp=="") tmp="0";
}

int main()
{
    init();
    while(cin>>s>>t)
    {
        ll anss=cal(s);
        standard(ss,anss);

        ll anst=cal(t);
        standard(tt,anst);

        ll ans=anss+anst;
        //debug(ans);
        standard(goa,ans);
        int len=goa.size();
        int lens=ss.size();
        int lent=tt.size();

        for(int i=0;i<len+2-lens;++i) cout<<' ';
        cout<<ss<<'\n';
        cout<<"+ ";
        for(int i=0;i<len-lent;++i) cout<<' ';
        cout<<tt<<'\n';
        cout<<"  ";
        for(int i=0;i<len;++i) cout<<'-';
        cout<<'\n';
        cout<<"  "<<goa<<'\n'<<'\n';
    }
    return 0;
}
View Code

 

UVA 10200 Prime Time

这都WA我,根号n试除法判素数便可,查了竟然WA在精度,不知道啥道理。

记住,当不得不使用除法,浮点数须要保留几位小数四舍五入be rounded to,且你WA了,能够加个小的eps??? 

 

总结:

而后除了欧拉筛的模板题,其余好像都或多或少查了题解。

不过仍是坚持想了,本身实现了,WA了T了才去查的。

只是感叹本身仍是TCL,还要加油啊。算法竞赛原本就是须要经验积累的嘛!

相关文章
相关标签/搜索