• Trick


    Trick

    1.快速乘

    解决乘法爆long long 的问题

    int mul(int a, int b, int P){//快速乘
        int L = a * (b >> 25ll) % P * (1ll << 25) % P;
        int R = a * (b & ((1ll << 25) - 1)) % P;
        return (L + R) % P;
    }
    

    其实就是利用了小学生都会的乘法分配律。

    我们要计算 $ a*bmodp $,设 $ b=L+R,$

    那么原式就变为为 (( a*L~mod~p+a*R~mod~p )~mod~p)

    我们把 L 钦定为 b 的二进制前 x位,R为 b的后 (64-x) 位。

    就得到了以上的代码(以上这份代码 x=25),复杂度近似为O(1)。

    ull qmul(const ull a,const ull b,const ull md)
    {
        LL c=(LL)a*b-(LL)((ull)((long double)a*b/md)*md);
        return c<0?md+c:((ull)c>md?c-md:c);
    }
    

    64位乘法

    #include <iostream>
    #include <cmath>
    #include <cstdio>
    #include <windows.h>
    using namespace std;
    long long a,b,p;
    long long mul(long long a,long long b,long long p){
    	long long ans=0;
    	while(b){
    		if(b&1)  ans=(ans+a)%p;
    		a=a*2%p;
    		b>>=1;
    	}
    	return ans;
    }
    int main(){
    	scanf("%lld%lld%lld",&a,&b,&p);
    	printf("%lld
    ",mul(a,b,p));
    	return 0;
    }
    

    2.快读快写

    inline int read(){
    	int x=0,f=1;char ch=getchar();
    	while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
    	while(isdigit(ch)){x=x*10+ch-'0';ch=getchar();}
    	return f*x;
    }
    

    快速输出

    template<typename F>
    inline void write(F x, char ed = '
    ')
    {
    	static short st[30];short tp=0;
    	if(x<0) putchar('-'),x=-x;
    	do st[++tp]=x%10,x/=10; while(x);
    	while(tp) putchar('0'|st[tp--]);
    	putchar(ed);
    }
    
    namespace IO
    {
        char ibuf[(1<<21)+1],obuf[(1<<21)+1],st[11],*iS,*iT,*oS=obuf,*oT=obuf+(1<<21);
        char Get(){return (iS==iT? (iT=(iS=ibuf)+fread(ibuf,1,(1<<21)+1,stdin),(iS==iT? EOF:*iS++)):*iS++);}
        void Flush(){fwrite(obuf,1,oS-obuf,stdout),oS=obuf;}
        void Put(char x){*oS++=x;if(oS==oT)Flush();}
        int read(){int x=0,c=Get();while(!isdigit(c))c=Get();while(isdigit(c))x=x*10+c-48,c=Get();return x;}
        void write(int x){int top=0;while(x)st[++top]=(x%10)+48,x/=10;while(top)Put(st[top--]);Put('
    ');}
    }
    

    3.快速max,min取模优化

    inline int min(int a,int b){return a<b?a:b}
    inline void Max(int &x,int y){if(x<y)x=y;}
    加法取模P
    inline void add(int &x, int y) { x += y, x >= P && (x -= P); }
    

    4.c++小知识

    0x7fffffff int 类型的最大值

    0x3f3f3f3f 是上面那个的一半

    一般赋值都写成(防止上溢)

    memset(s,0x3f,sizeof(s))
    

    5.计算代码运行时间

    返回ms

        int st=clock();
        system("1.exe < 1.in > 1.txt");
    	n=read();
    
    
        int ed=clock();
        cout<<(double)(ed-st)/CLOCKS_PER_SEC<<endl;
    

    6.邻接表找反向边

    初值tot=1;

    然后 i^1就是反向边

    edge(u,v)

    for(int i=2;i<=tot;i+=2)
    	u=to[i],v=to[i^1];
    

    7.memcpy

    char a[100], b[50];
    memcpy(b, a,sizeof(b));
    //把a复制给b      
    //注意如用sizeof(a),会造成b的内存地址溢出
    

    8.多起点一终点的推荐反着跑

    9.scanf输入

    scanf

    long double %Lf

    unsigned int %u

    10.num[++num[0]]=x;

    用num[0]计数,有多个数组的时候,不会弄混cnt名称

    11.fix

    当数组中可能遇见负数的时候,可以考虑采用修正值fix,将取值的区域平移。

    12.区间中位数

    二分一个中位数的值ans,大于ans的赋为1,小于-1(等于再说)

    找区间内有无连续子段和大于0,判断ans+还是ans-

    13.π

    常数:M_PI

    自然对数的底数e: M_E

    14.节约空间

    int 4字节,char 、 bool 1字节,所以如果Int只存几个数就用char 、 bool

    15.复杂度计算

    调和级数 $$sum_{i=1}^{n}{n/i} $$ = O(nlogn)

    16.删边

    离线逆序处理,删边改成加边

    一些模板

    17 二进制1的个数

    int calc(int x) {
    	int sum=0;
    	for(;x;x-=x&-x) sum++;
    	return sum;
    }
    

    18.函数向数组传参

    int *ct(一维) int (*vv)[N](二维)
        调用就只写数组名
    

    https://blog.csdn.net/hang404/article/details/85071114

    19.四舍五入

    https://blog.csdn.net/inter_peng/article/details/51397646

    https://blog.csdn.net/qq_42187809/article/details/85395715

    https://www.cnblogs.com/weifengxiyu/p/5422540.html

    大佬trick收集

    https://www.cnblogs.com/Miracevin/p/9031419.html

    https://www.luogu.com.cn/blog/i207M/xiao-ji-qiao-trick-sai-lu-ge-ren-zong-jie

  • 相关阅读:
    .net的一致性哈希实现
    一次基于etcd的分布式锁自动延时失败问题的排查
    一次kubernetes资源文件创建失败的排查
    去除右键菜单中的图形属性
    三款实用的视频格式转换工具
    使用iframe设置frameset的高度
    IIS中asp网站播放flv视频技术
    Joomla3.1.1在64位win7下安装
    64位win7旗舰版搭建apache+php+mysql开发环境[转]
    Windows下实战Apache+PHP [转]
  • 原文地址:https://www.cnblogs.com/ke-xin/p/14102340.html
Copyright © 2020-2023  润新知