暴力求解/数学问题

1.数学问题

(1)素数

算术基本定理:若\(a\in Z\),\(a\gt 1\),则有\(a=p_1p_2\cdots p_n\),其中\(p_i\)为素数
证明:假定定理对所有小于a的正整数均成立 若a为素数,则结论显然成立 若a为合数,\(a=bc\),其中\(1\lt b,c\lt a\)由归纳假设\(b=p_1p_2\cdots p_k,c=p_{k+1}p_{k+2}\cdots p_n\)
for(int i = 2; i <= n; i++)
{
	if(!vis[i])
	prime[cnt++] = i;
	for(int j = 0; j<cnt && i*prime[j]<=n; j++)
	{
		vis[i*prime[j]] = 1;
		if(i % prime[j] == 0) break;
	}
}
判断素数
陷阱:1的特殊处理(极易错)
bool judge(int x){
	if(x<2)return 0;
    for(int i=2;i<=sqrt(x);++i){//9
        if(x%i==0)return 0;
    }
    return 1;
}

(2)gcd

long long gcd(long long a,long long b){return b==0?a:gcd(b,a%b);}//原来a>b现调换

(3)回文数

for(int i = 0; i < index / 2; i++) {
	if(arr[i] != arr[index-i-1]) 
	{         
		printf("No\n");            
		flag = 1;break;        
	}    
}if(!flag)printf("Yes\n");

3.数据类型范围

数据类型 用10表示 用2表示
unsigned int 0, 4×10^{9} 0, 2^{32}-1
int -2×10^{9}, 2×10^{9} -2^{31}, 2^{31}-1
unsigned long 0, 4×10^{9} 0, 2^{32}-1
long -2×10^{10}, 2×10^{10} -2^{31}, 2^{31}-1
long long 0, 9×10^{18} -2^{63}, 2^{63}-1
unsigned long long 0, 10^{19} 0, 2^{64}-1
数据类型 比特位数 有效数字 用10表示 用2表示
float 32 6~7 -3.4*10^{38}~+3.4*10^{38} -2^{128} ~ +2^{128}
double 64 15~16 -1.7*10^{-308}~1.7*10^{308} ——
long double 128 18~19 -1.2*10^{-4932}~1.2*10^{4932} ——

求解技巧

思路:遍历范围内全部数字,依据首+尾/首+间隔遍历

1.二分法upper_bound,lower_bound的运用

2.PAT题,利用次序

for (int i = 0; i < len; i++) {
	if (s[i] == 'T')countt++;
}
for (int i = 0; i < len; i++) {
	if (s[i] == 'P')countp++;
	if (s[i] == 'T')countt--;
	if (s[i] == 'A')result = (result + (countp * countt) % 1000000007) % 1000000007;
}

3.数学形式题注意对数字的直接利用,少用字符串特性
4.-(n)问题

int n=-2^31;
-n存储需用long long

posted @ 2019-12-13 20:43  飞翔的菜鸟123  阅读(275)  评论(0编辑  收藏  举报