2023.3.4

与(&)

奇数&1 为1  ,if(a&1) 为奇数

偶数 &1为0

在一堆偶数个数中奇数个数的数,可用亦或^

位运算符直接对二进制操作,<<左移,(*2)

a对m取模运算 a%m

(a*b)%mod=(a%mod * b%mod)%mod

(a-b)%mod=(a-b+mod)%mod  //减法取模需注意

算数基本定理又称为唯一分解定理,它可以表述为:任何一个大于1的自然数N,都可以唯一分解为有限个质数的乘积

stack 后进先出  从栈顶弹出元素

10进制转换为x进制的模板

string to_x(int n, int x)// n为10进制数, x为转换的
{
    string ans;
    while(n){
        int mod = n%x;
        if(mod<10) ans += mod+'0';
        else ans += mod-10+'A';
        n /= x;
    }
    reverse(ans.begin(),ans.end());
    return ans;
}

x进制转化为10进制

int to_dec(string s,int x){// s 为x进制的表示
    reverse(s.begin(),s.end());
    int base = 1, ans = 0;// base为基数, ans为转换后的十进制
    for(int i=0;i         int val;
        if('0'<=s[i]&&s[i]<='9') val = s[i]-'0';
        else val = s[i]-'a'+10;
        ans += val * base;
        base *= x;
    }
    return ans;

求1到n中,不是a或b的因数的和

先求有几个因数la=n/a,再用公式la*(la+1)/2 *a  可以求出所有因数的和

a和b的公共因数c= (a*b)/__gcd(a,b)   ,因数个数lc=n/c

#include
using namespace std;
typedef unsigned long long ll;
int main()
{
    ll n,a,b,c,ans;
    cin>>n>>a>>b;
    ll sum=(n+1)*n/2;
    ll la=n/a;
    ll A; 
    A=la*(la+1)/2*a;
    ll lb=n/b;
    ll B;
    B=lb*(lb+1)/2*b;
    c=(a*b)/__gcd(a,b);
    ll lc;
    lc=n/c;
    ll C;
    C=lc*(lc+1)/2*c;
    ans=sum-A-B+C;
    cout<     return 0;
}

有负数对负数取模

#include 
using namespace std;

int main()
{
    //freopen("input.txt","r",stdin);
    char js[]="0123456789ABCDEFGHIJ";//常量数组保存对应基数,常量大法吼啊
    int n,r;
    scanf("%d%d",&n,&r);
    printf("%d=",n);//提前输出n,因为后面n变化了,如果想在后面输出,就要多加一个变量保存n
    stacks;//用栈来保存倒序的结果,便于输出
    while(n){
        int a=n%r;
        n/=r;
        if(a<0) {a-=r;n++;}//如果余数为负数,余数减去进制数,商加1
        s.push(a);//结果进栈
    }
    while(!s.empty()){//输出结果
        printf("%c",js[s.top()]);
        s.pop();
    }
    printf("(base%d)\n",r);
    return 0;
}

你可能感兴趣的:(apache)