数学问题集(续更)

目录

P2415 集合求和

P1143 进制转换

 约瑟夫环问题

等差数列

质数拆分

阶乘约数

快速幂​


P2415 集合求和

结论:A的所有子集元素之和为s*2^(n-1);

s为所以元素和,n为元素个数;

#include<bits/stdc++.h>
using namespace std;
int n,num;
long long sum;
int main()
{
	while(cin>>num)
	{
		sum+=num;
		n++;
	}
	cout<<(long long)(sum*pow(2,n-1));    //一定要强制类型转换(long long)(……)
                                              //别忘了后面的括号!
	return 0;
}

P1143 进制转换

看完这篇就懂了: 

二进制,八进制,十进制,十六进制的相互转换【简单易懂】_NO.-LL的博客-CSDN博客

#include<bits/stdc++.h>
using namespace std;
string s;
int a,b;
int wei,sum,num;
int c[10000010];
int main()
{
	cin>>a>>s>>b;
	for(int i=0;i<s.size();i++)
	{
		if(s[i]<'A')
		{
			wei=pow(a,s.size()-1-i);    //从大向小取位
			wei*=(s[i]-'0');
			sum+=wei;
		}
		else
		{
			wei=pow(a,s.size()-1-i);
			wei*=(s[i]-'A'+10);
			sum+=wei;
		}
	}
                                       //sum为a进制转化为十进制的值
	while(sum>0)
	{
		c[num++]=sum%b;    //连除法
		sum/=b;
	}
	for(int i=num-1;i>=0;i--)    //对应前面,“从下到上输出”
	{
		if(c[i]>=10) printf("%c",c[i]+'A'-10);    //可能是字符,cout默认数字
		else cout<<c[i];
	}
	 
	return 0;
}

 约瑟夫环问题

#include<bits/stdc++.h>
using namespace std;
vector<int>a;
int n,k,m;
int main()
{
    cin>>n>>k>>m;
    for(int i=0;i<n;i++) a.push_back(i);
    
    while(n!=1)
    {
        k=(k+m-1)%n;
        a.erase(a.begin()+k);
        
        n--;
    }
    cout<<a[0];
    return 0;
}

等差数列

第十届蓝桥杯省赛C++B/C组,第十届蓝桥杯省赛JAVAC组

小技巧:求最大公约数直接用函数 __gcd() ;

#include <iostream>
#include <algorithm>
using namespace std;

const int N = 100010;
int a[N];
int n;

/*int gcd(int a,int b) {
    return b ? gcd(b, a % b) : a;
}
*/
int main()
{
    scanf("%d",&n);
    for(int i = 0;i < n;i ++) scanf("%d",&a[i]);
    sort(a,a + n);
    
    int d = 0;
    for(int i = 1;i < n;i ++) d = __gcd(d, a[i] - a[i - 1]);
    
    if(!d) printf("%d\n",n);
    else printf("%d\n",(a[n - 1] - a[0]) / d + 1);
    
    return 0;
}



质数拆分

55965365465060

#include<iostream>
#include<algorithm>
using namespace std;
#define ll long long
bool isprime(int n) {//判断素数
	if (n < 2)return 0;
	for (int i = 2; i <= n / i; i++) {
		if (n % i == 0)return 0;
	}
	return 1;
}
ll f[2020];
int main() {
	f[0] = 1;
	for (int i = 2; i <= 2019; i++) {
		if (isprime(i)) {
			for (int j = 2019; j - i >= 0; j--) {
				if (f[j - i] != 0)f[j]+=f[j-i];
			}
		}
	}
	cout << f[2019] << endl;
	return 0;
}

阶乘约数

分解质因数:

在这里插入图片描述

 在这里插入图片描述

举个例子:

180=2^2 *3^2* 5^1=p1^a1*p2^a2*p3^a3(a1=2,a2=2,a3=1)
180的约数个数为(1+2) * (1+2) * (1+1)=18个。 

 对于100!得就是将1,2,3.......99,100的对应质因子的幂次之和;如拿 i 当pi ,cnt[i]当ai;又如:1,2,3,4,5,6........99,100的质因子 2^(0+1+0+2+0+1.....0,2)

#include<bits/stdc++.h>
using namespace std;
const int N = 1e2 + 10;
int cnt[N]; // cnt[i] 存的是质因子 i 的幂次
int main() {
    for(int i = 1 ; i <= 100 ; i ++) {
        int x = i;
        // 质因子分解
        for(int j = 2 ; j * j <= x ; j ++) {//求质数公式 
            if(x % j == 0) {
                while(x % j == 0) x /= j , cnt[j] ++ ; 
                        // j是其中一个质因子,++算1..100的次幂和
            }
        }
        if(x > 1) cnt[x] ++ ;//自己本身也是约数 
    }
    long long ans = 1;
    for(int i = 1 ; i <= 100 ; i ++) {
        if(cnt[i] != 0) ans *= (cnt[i] + 1);
    }
    cout << ans;
    return 0;
}

快速幂

二进制优化:

将b转化为2进制,并用乘法表示

 

注意要long long 不然会爆!!!

#include<iostream>
using namespace std;
long long qmi(long long a,int b,int p)
{
    long long res=1;
    while(b)//对b进行二进制化,从低位到高位
    {
        //如果b的二进制表示的第0位为1,则乘上当前的a
        if(b&1) res = res *a %p;
        //b右移一位
        b>>=1;
        //更新a,a依次为a^{2^0},a^{2^1},a^{2^2},....,a^{2^logb}
        a=a*a%p;
    }
    return res;
}
int main()
{
    int n;
    cin>>n;
    while(n--)
    {
        int a,b,p;
        long long res=1;
        cin>>a>>b>>p;
        res = qmi(a,b,p);
        cout<<res<<endl;
    }
    return 0;
}

  • 12
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

NO.-LL

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值