HENAU 冬令营 数学专题

A - A^B Mod C

在这里插入图片描述就是快速幂,次方是二的倍数就本身平方

#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ull; 
int main()
{
	ull a,b,c;
	ull s=1;
	cin>>a>>b>>c;
	while(b!=1)
    {
        if(b%2==1)
        {  
            s=s*a;
            s=s%c;
        }
            a=a*a; 
            a=a%c;
            b=b/2;
    }
    cout<<(s*a)%c;
	return 0;
 } 

这里可以用位运算代替

#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ull; 
int main()
{
	ull a,b,c;
	ull s=1;
	cin>>a>>b>>c;
	while(b!=1)
    {
        if(b&1)
        {  
            s=s*a;
            s=s%c;
        }
            a=(a*a)%c;
            b>>=1;
    }
    cout<<(s*a)%c;
	return 0;
 } 

B - 逆元

在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;
#define ll long long


ll inv2(ll a,ll m)
{
    return a==1?1:(m-m/a)*inv2(m%a,m)%m;
}

bool isprime(ll a)
{
    for(ll i=2;i<=sqrt(a);i++)
        if(a%i==0)
            return false;
    return true;
}

int main()
{
    ll p;
    cin>>p;
    if(!isprime(p))
    {
        cout<<"AKCniubi";
        return 0;
    }

    ll sum=(p-1)/2*p;
    if(p==2)
        sum=1;

    cout<<sum;

	return 0;
}

C - 判决素数个数

在这里插入图片描述

#include <cstdio>
#include <cstring>
#include <cmath>
bool isPrime(int x){
    if(x == 1)return false;
    if(x % 2 == 0 && x != 2)return false;
    else{
        for(int i = 3;i < sqrt(x)+1;i += 2){
            if(x % i == 0)return false;
        }
        return true;
    }
}
int main(){
    int x,y;
    scanf("%d%d",&x,&y);
    int sum = 0;
    if(x > y){
        int t;
        t = x;
        x = y;
        y = t;
    }
    for(int i = x;i <= y;i++){
        if(isPrime(i) == true)sum++;
    }
    printf("%d\n",sum);
    return 0;
}

D - 矩阵乘法

在这里插入图片描述

#include<stdio.h>
int main(){
	int A[100][100],B[100][100],C[100][100]={0};
	int n,m,k,i,j,t;
	scanf("%d%d%d",&n,&m,&k);
	for(i=0;i<n;i++){
		for(j=0;j<m;j++){
			scanf("%d",&A[i][j]);
		}
	}
	for(i=0;i<m;i++){
		for(j=0;j<k;j++){
			scanf("%d",&B[i][j]);
		}
	}
	for(i=0;i<n;i++){
		for(j=0;j<k;j++){
			for(t=0;t<m;t++){
				C[i][j]=C[i][j]+A[i][t]*B[t][j];
			}
			printf("%d ",C[i][j]);
		}
		printf("\n");	
	}
	return 0;
} 

E - Bash游戏

在这里插入图片描述

#include<stdio.h>
int main()
{
	int k;
	scanf("%d",&k);
	while(k--)
	{
		int m,n;
		scanf("%d %d",&m,&n);
		int l;
		l=m%(n+1);
		if(l!=0)
		printf("A\n");
		else
		printf("B\n");
	}
	return 0;
}

F - 取石子游戏

在这里插入图片描述

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
 
int main()
{
	int a, b, cha, c;
	double k=(sqrt(5.0)+1)/2;	
	while(scanf("%d%d", &a, &b)!=EOF && (a+b)!=0)
	{
		if(a==b) //如果相同,可以一次取完
		{
			printf("1\n");//0 0
			continue;
		}
		if(a>b) swap(a, b);//a代表小的,代表大的
		cha=b-a;//求差
		c=int(cha*k);//计算如果b固定的话,a应该是多少
		if(c==a)//如果相等,那么先手必输
			printf("0\n");
		else
		{
			printf("1\n");
		/*	int bb=c+cha;//计算如果c当做小的,大的应该是多少
			if(b-bb==a-c)//判断这个可不可以两堆同时拿
				printf("%d %d\n", c, bb);
			for(int i=a-1, j=1; i>=1; i--, j++)//固定a,求另一个数
			{
				if(int(j*k)==i)
				{
					printf("%d %d\n", int(j*k), a);
					break;
				}
			}
			for(int i=b-1, j=1; i>=1; i--, j++)//固定b,求另一个数
			{
				if(int(j*k)==i)
				{
					printf("%d %d\n", int(j*k), b);
				}
			}*/
		}
	}
	return 0;
 } 

G - Matches Game

在这里插入图片描述

#include<iostream>
using namespace std;
int main(){

	int k;
	while(scanf("%d",&k)!=EOF){
		int sum=0,cnt=0;
		for(int i=1;i<=k;++i){
			int x;
			scanf("%d",&x);
			sum^=x;
			if(x>=2) cnt++;
		}
		if((sum!=0&&cnt!=0)||(!sum&&!cnt)) printf("Yes\n");
		else printf("No\n");
	}
	return 0;
}

H - 互质数的个数(一)

在这里插入图片描述

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long LL;
const LL maxa=1e6+10;
LL euler[maxa];
void euler_deal(){//O(max_n)时间内筛出欧拉函数值的表 
	for(int i=0;i<maxa;i++)		euler[i]=i;
	for(int i=2;i<maxa;i++)
		if(euler[i]==i)
			for(int j=i;j<maxa;j+=i)	euler[j]=euler[j]/i*(i-1); 
}
int main(){
	int t;
	scanf("%d",&t);
	euler_deal();
	while(t--){
		LL	n;
		scanf("%lld",&n);
		printf("%lld\n",euler[n]);	
	} 
}

I - Sumdiv

在这里插入图片描述

#include<stdio.h>
#include<string.h>
#include<math.h>
const int N = 10000;
const int mod = 9901;
int p[N];
int n[N];
int A,B;

//将A分解成素因子的积,A = p[0]^n[0]+p[1]^n[1]+....+p[k-1 ]^n[k-1];
int Div(int A)
{
    int k = 0,i;
    for(i = 2; i*i <= A;)
    {
        if(A%i == 0)
        {
            n[k] = 0;
            p[k] = i;
            while(!(A%i))
            {
                n[k]++;
                A/=i;
            }
            k++;
        }
        if(i == 2)
            i++;
        else i += 2;
    }
    if(A != 1)
    {
        p[k] = A;
        n[k++] = 1;
    }
    return k;
}

long long power(long long p,long long n)//用反复平方法计算p^n;
{
    long long sq = 1;
    while(n>0)
    {
        if(n&1)
            sq = (sq*p)%mod;//若n是奇数,把p乘到sq;
        n = n/2;
        p = p*p%mod;
    }
    return sq;
}

long long cal(long long p,long long n)//用反复平方法计算1+p+p^2+....p^n;
{
    if(n == 0)
        return 1;
    if(n&1)//如果n是奇数
        return (cal(p,n/2)*(1+power(p,n/2+1)))%mod;
    else return (cal(p,n/2-1)*(1+power(p,n/2+1))+ power(p,n/2))%mod;
}

int main()
{
    scanf("%d %d",&A,&B);
    
        int k,i,sum;
        k = Div(A);

        sum = 1;
        for(i = 0; i < k; i++)
        {
            sum = (sum*(cal(p[i],n[i]*B)%mod))%mod;
        }
        printf("%d\n",sum);
    
    return 0;
}

J - The Lottery

在这里插入图片描述

#include <iostream>
#include <cstdlib>
#include <cstdio>
 
using namespace std;
 
long long gcd( long long a, long long b )
{
	return (!b)?a:gcd( b, a%b );
}
 
long long lcm( long long a, long long b )
{
	return a/gcd( a, b )*b;
}
 
int number[16];
 
int main()
{
	int n,m;
	while ( cin >> n >> m ) {
		for ( int i = 0 ; i < m ; ++ i )
			cin >> number[i];
		
		int e = 1<<m,ans = n,bits; 
		for ( int i = 1 ; i < e ; ++ i ) {
			long long l = 1LL; 
			bits = 0;
			for ( int j = 0 ; j < m ; ++ j )
				if ( i&(1<<j) ) {
					l = lcm( l, number[j] );
					bits ++;
				}
			if ( bits&1 ) 
				ans -= n/l;
			else ans += n/l;
		}
		
		printf("%d\n",ans);
	}
	return 0;
}

K - 组合数问题

#include<bits/stdc++.h>
using namespace std;
int C[2005][2005];//杨辉三角组合数数组 
int ans[2005][2005];
int main()
{
    int t,k;
    cin>>t>>k;
    C[1][1]=1;
    for(int i=0;i<=2000;i++) 
        C[i][0]=1;
    for(int i=2;i<=2000;i++){
        for(int j=1;j<=i;j++)
            C[i][j]=(C[i-1][j-1]+C[i-1][j])%k;
    }
    for(int i=2;i<=2000;i++){
        for(int j=1;j<=i;j++){
            ans[i][j]=ans[i-1][j]+ans[i][j-1]-ans[i-1][j-1];
            if(C[i][j]==0)//是k的倍数
                ans[i][j]++; 
        }
        ans[i][i+1]=ans[i][i];
    }
/*    for(int i=1;i<=20;i++){
        for(int j=1;j<=i;j++)
            cout<<ans[i][j]<<" ";
        cout<<endl;
    }
    cout<<endl;
    for(int i=1;i<=20;i++){
        for(int j=1;j<=i;j++)
            cout<<C[i][j]<<" ";
        cout<<endl;
    }*/
    while(t--){
        int n,m;
        cin>>n>>m;
        if(n<m)
            m=n;
        cout<<ans[n][m]<<endl;
    }
    return 0;
}

L - 同余方程

在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;
#define ll long long
// 求解得到的 x 就是 a 的逆元,y 就是 b 的逆元。
ll exgcd(ll a, ll b, ll &x, ll &y)
{
    if(b == 0)
    {
        x = 1;
        y = 0;
        return a;
    }
    ll r = exgcd(b, a % b, x, y);
    ll t = x;
    x = y;
    y = t - a / b * y;

    return r;
}
int main()
{
    ll a, b, x, y;
    cin >> a >> b;
    exgcd(a, b, x, y);
    cout << (x + b) % b <<endl;     //避免 x 是负数
    return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

橘落京城

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

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

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

打赏作者

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

抵扣说明:

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

余额充值