0
点赞
收藏
分享

微信扫一扫

数学专题-十五组部分题解

janedaring 2022-01-20 阅读 56

A- A^B Mod C

快速幂取模

#include<stdio.h>
typedef long long ll;
int JS(ll  a,ll b,ll c)
{
    ll ans = 1;
    a=a%c;
    while(b>0)
    {
        if(b & 1)
            ans=ans*a %c;
        b >>= 1;
        a=a*a%c;
    }
    return ans;
 
}
 
int main()
{
    ll a,b,c;
    scanf("%lld%lld%lld",&a,&b,&c);
    a = JS(a,b,c);
    printf("%lld",a);
 
    return 0;
}

C-判决素数个数

素数筛

#include<stdio.h>
#include<math.h>
#define N 100010
bool book[N];

void isPrime()
{
    book[1] = 1;
    for(int i=2;i*i<N;i++)
    {
        if(!book[i])
        {
            for(int j=i*i;j<=N;j+=i)
                book[j] = 1;
        }
    }
}

int main()
{
    isPrime();
    int m,n,t;
    scanf("%d%d",&m,&n);
    int sum = 0;
    if(m > n)
    {
        t=m;
        m=n;
        n=t;
    }
    for(int i=m;i<=n;i++)
    {
        if(!book[i])sum++;
    }
    printf("%d",sum);
    return 0;
}

D-矩阵乘法

简单的循环计算

#include<stdio.h>

int a[110][110],b[110][110],c[110][110];

int main()
{
    int n,m,k;
    scanf("%d%d%d",&n,&m,&k);
    
    for(int i=0;i<n;i++)
        for(int j=0;j<m;j++)
            scanf("%d",&a[i][j]);
    for(int i=0;i<m;i++)
        for(int j=0;j<k;j++)
            scanf("%d",&b[i][j]);
    
    for(int i=0;i<n;i++)
        for(int j=0;j<k;j++)
        {
            int sum=0;
            for(int h=0;h<m;h++)
            {
                sum+=a[i][h]*b[h][j];
            }
            c[i][j]=sum;
        }
    for(int i=0;i<n;i++)
        for(int j=0;j<k;j++)
            {
                printf("%d",c[i][j]);
                if(j != k-1)printf(" ");
                else printf("\n");
            }
    return 0;
}

E-Bash游戏

巴什博弈

#include<stdio.h>
typedef long long ll;


int main()
{
    int T;
    ll n,k;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%lld%lld",&n,&k);
        int flag = -1;
        flag= n%(k+1)==0?1:2;
        if(flag == 1)printf("B\n");
        if(flag == 2)printf("A\n");
    }

    return 0;
}

F-取石子游戏

威佐夫博弈

#include<stdio.h>
#include<math.h>

int main()
{
    int m,n,temp;
    double ret,op;
    ret = (sqrt(5)+1)/2.0;
    while(~scanf("%d%d",&m,&n))
    {
        if(m>n)
        {
            int t;
            t=m;
            m=n;
            n=t;
        }
        op = (double)(n-m);
        temp=(int)(op*ret);
        if(m == temp)printf("0\n");
        else printf("1\n");
    }
    return 0;
}

H - 互质数的个数(一)

欧拉函数

#include<stdio.h>
typedef long long ll;

ll euler (ll n)
{
    ll ans = n;
    for(ll i=2;i*i<=n;i++)
    {
        if(n % i == 0)
        {
            ans =ans/i*(i-1);
            while(n %i ==0)n/=i;
        }
    }
    if(n > 1)ans = ans /n *(n-1);

    return ans;
}


int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        ll ans;
        scanf("%lld",&ans);
        ans =euler(ans);
        printf("%lld\n",ans);
    }

    return 0;
}
举报

相关推荐

0 条评论