模版整理:

晒素数

void init()
{
    cas = 0;
    for (int i = 0 ; i < MAXD ; i++) is_prime[i] = true;
    is_prime[0] = is_prime[1] = false;
    for (int i = 2 ; i < MAXD ; i++)
    {
        if (is_prime[i])
        {
            prime[cas++] = i;
            for (int j = i + i ; j < MAXD ; j += i)
                is_prime[j] = false;
        }
    }
}

合数分解

int x = src[i];
            int cnt = 0,tot = 0;
            for (int j = 0 ; j < cas && prime[j] * prime[j] <= x ; j++)
            {
                if (x % prime[j] == 0)
                {
                    res[cnt++] = prime[j];
                    while (x % prime[j] == 0)
                    {
                        tot++;
                        x /= prime[j];
                    }
                }
            }
            if (x > 1)
            {
                res[cnt++] = x;
                tot++;
            }

大素数筛。1-2^31内某个长度小于10W的区间的素数个数

#include <map>
#include <set>
#include <list>
#include <cmath>
#include <ctime>
#include <deque>
#include <stack>
#include <queue>
#include <cctype>
#include <cstdio>
#include <string>
#include <vector>
#include <climits>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#define LL long long
#define PI 3.1415926535897932626
using namespace std;
int gcd(int a, int b) {return a % b == 0 ? b : gcd(b, a % b);}
const int MAXN = 100000;
LL prime[MAXN / 10];
bool is_prime[MAXN + 10];
bool flag[MAXN + 10000] ;
int cas;

void init()
{
    for (int i = 0 ; i < MAXN ; i++) is_prime[i] = true;
    is_prime[0] = false;
    is_prime[1] = false;
    cas = 0;
    for (int i = 2 ; i < MAXN ; i++)
    {
        if (is_prime[i])
        {
            prime[cas++] = i;
            for (int j = i + i ; j < MAXN ; j += i)
                is_prime[j] = false;
        }
    }
}

int main()
{
    init();
    int T,kase = 1;
    scanf("%d",&T);
    while (T--)
    {
        LL a,b;
        scanf("%lld%lld",&a,&b);
        if (b <= 80000)
        {
            int cnt = 0;
            for (int i = a ; i <= b ; i++)
                if (is_prime[i]) cnt++;
            printf("Case %d: %d\n",kase++,cnt);
            continue;
        }
        else
        {
            if (a <= 2) a = 2;
            int sz = b - a;
            for (int i = 0 ; i <= sz ; i++) flag[i] = true;
            for (int i = 0 ; i < cas && prime[i] * prime[i] <= b ; i++)
            {
                int k = a / prime[i];
                if (k * prime[i] < a) k++;
                if (k <= 1) k++;
                while (k * prime[i] <= b)
                {
                    flag[k * prime[i] - a] = false;
                    k++;
                }
            }
            int cnt = 0;
            for (int i = 0 ; i <= sz ; i++)
                if (flag[i] == true) cnt++;
            printf("Case %d: %d\n",kase++,cnt);
        }
    }
    return 0;
}

判断1-N中5的因子的个数,可以将代码5改编

int cnt = 0;
    while (mid)
    {
        cnt += mid / 5;
        mid /= 5;
    }

中国剩余定理

LL china(int n,int *a,int *m)
{
        LL M = 1,d,y,x = 0;
        for (int i = 0 ; i < n ; i++) M *= m[i];
        for (int i = 0 ; i < n ; i++)
        {
                LL w = M / m[i];
                gcd(m[i],w,d,d,y);
                x = (x + y * w * a[i]) % M;
        }
        return (x + M) % M;
}

POJ 1061 青蛙的约会

欧几里德解方程

(y+nt)-(x+mt) = k * L;

(n - m)t + K'L = x - y;

求最小正整数解

#include <map>
#include <set>
#include <list>
#include <cmath>
#include <ctime>
#include <deque>
#include <stack>
#include <queue>
#include <cctype>
#include <cstdio>
#include <string>
#include <vector>
#include <climits>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#define LL long long
#define PI 3.1415926535897932626
using namespace std;
LL gcd(LL a, LL b) {return a % b == 0 ? b : gcd(b, a % b);}
LL ext_gcd(LL a,LL b,LL &x,LL &y)
{
    if (a == 0 && b == 0) return -1;
    if (b == 0)
    {
        x = 1;
        y = 0;
        return a;
    }
    LL d = ext_gcd(b,a % b,y,x);
    y -= a / b * x;
    return d;
}
LL x,y,m,n,L;

int main()
{
    while (scanf("%I64d%I64d%I64d%I64d%I64d",&x,&y,&m,&n,&L) != EOF)
    {
        LL a = n - m, b = L, c = x - y;
        LL d = gcd(a,b);
        if (c % d != 0)
        {
            puts( "Impossible" );
            continue;
        }
        a /= d;
        b /= d;
        LL x,y;
        ext_gcd(a,b,x,y);
        //cout << a << " " << b << " " << x << " " << y << endl;
        x *= c / d;
        y *= c / d;
        //cout << y << endl;
        //cout << x << endl;
        LL  tmp = L / d;
        x = (x % tmp + tmp) % tmp;
        cout << x << endl;
    }
    return 0;
}
View Code

相关文章: