小巧妙

约瑟夫问题

#include <stdio.h>
#include <conio.h>
int main( void )
{
    int n, i, m, p,t;
    while(~scanf("%d %d", &n, &m))
    {
        t=1;
        i=0;
        while( ++i <= n )
        {
            p = i * m;
            while (p > n)
                p = p - n + (p - n - 1)/(m - 1);
            if(t)
            {
                t=0;
                printf("%d", p);
            }
            else printf(" %d",p);
        }
        printf("\n");
    }
    return 0;
}

最大公约数问题

unsigned int gcd(unsigned int a,unsigned int b)
{
    int r;
    while(b>0)
    {
         r=a%b;
         a=b;
         b=r;
    }
    return a;
}
unsigned int gcd(unsigned int a,unsigned int b)
{
    while(b^=a^=b^=a%=b);
    return a;
}
unsigned int gcd(unsigned int a,unsigned int b)
{
    return (b>0)?gcd(b,a%b):a;
}

ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
ll lcm(ll a,ll b){return a/gcd(a,b)*b;}
ll powmod(ll a,ll b,ll MOD){ll ans=1;while(b){if(b%2)ans=ans*a%MOD;a=a*a%MOD;b/=2;}return ans;}  快速幂取膜
double dpow(double a,ll b){double ans=1.0;while(b){if(b%2)ans=ans*a;a=a*a;b/=2;}return ans;}  快速幂

函数lower_bound()在first和last中的前闭后开区间进行二分查找,返回大于或等于val的第一个元素位置。如果所有元素都小于val,则返回last的位置

举例如下:

一个数组number序列为:4,10,11,30,69,70,96,100.设要插入数字3,9,111.pos为要插入的位置的下标

pos = lower_bound( number, number + 8, 3) - number,pos = 0.即number数组的下标为0的位置。

pos = lower_bound( number, number + 8, 9) - number, pos = 1,即number数组的下标为1的位置(即10所在的位置)。

pos = lower_bound( number, number + 8, 111) - number, pos = 8,即number数组的下标为8的位置(但下标上限为7,所以返回最后一个元素的下一个元素)。

所以,要记住:函数lower_bound()在first和last中的前闭后开区间进行二分查找,返回大于或等于val的第一个元素位置。如果所有元素都小于val,则返回last的位置,且last的位置是越界的!!~

返回查找元素的第一个可安插位置,也就是“元素值>=查找值”的第一个元素的位置


A^x%C = A^(x % Phi(C) + Phi(C)) (mod C) ( x>=Phi(C) ) 

phi(c)欧拉phi函数:phi(n)是所有小于n的正整数里,和n互素的整数的个数

 

 

由于要取模而且 2 mod互质,因此可以用费马小定理来降幂

2^n%m == ( 2^(n%(m-1))*2^(n/(m-1)*(m-1)) )%m ==(2^(n%(m-1)))%m * ((2^k)^(m-1))%m == (2^(n%(m-1)))%m;//k=n/(m-1)

 

2^n%m=(2^(n%(m-1)))%m

map<string,int>::const_iterator it;     
for(it=maps.begin(); it!=maps.end(); it++)
            cout<<it->first<<" "<<it->second<<endl;





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值