【无标题】

第七组数学专题题解


A题 A^B Mod C
经典快速幂问题

下面展示一些 内联代码片

// An highlighted block
#include<iostream>
#include<cstdio>
typedef long long ll;
using namespace std;
ll poew(long long base,ll pow,ll p ){
	ll res=1;
	if(pow==0)res=1%p;
	while(pow>0){
		if(pow&1)
		res=res*base%p;
		pow=pow>>1;
		base=(base*base)%p;
	}
	return res;
} 
int main(){
	ll a,b,p,res;
	cin>>a>>b>>p;
	cout<<poew(a,b,p)<<endl;
} 

B题 逆元
找规律加判断质数问题

// An highlighted block
#include<iostream>
using namespace std;
#define ll long long
ll inv(ll a,ll mod)
{
    return a==1 ? 1:( mod-mod/a ) * inv(mod%a,mod) % mod;
}
bool isprime(ll x)
{
    for(ll i=2;i*i<=x;i++)
    {
        if(x%i==0)
            return false;
    }
    return true;
}
int main()
{
    ios::sync_with_stdio(false);
    ll p;
    while(cin>>p)
    {
        if(!isprime(p))
        {
            cout<<"AKCniubi"<<endl;
        }
        else
        {
            cout<<(p-1)*p/2<<endl;
        }
    }
    return 0;
}

C - 判决素数个数
素数筛

#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
bool isprime[100005];
int array[100000];
int main(){
	int x,y;
	int cnt=0;
	scanf("%d%d",&x,&y);
	if(x>y){
		int t=x;
		x=y;
		y=t;
	}
	memset(isprime,true,sizeof(isprime));
	isprime[1]=false;
	for(int i=2;i<=100000;i++){
	     if(isprime[i]){
	     	array[cnt++]=i;
	     	for(int j=i*2;j<=100000;j+=i){
	     		isprime[j]=false;
			 }
		 }
	}
	int sum=0;
	for(int i=0;i<cnt;i++){
		if(array[i]>y)break;
		else if(array[i]>=x)sum++;
	}
	printf("%d\n",sum);
	return 0;
} 

D - 矩阵乘法
基本数学知识

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxa=100;
int a[maxa][maxa],b[maxa][maxa];
int ans[maxa][maxa];
int n,m,k;
void solve(){
	for(int i=0;i<n;i++)
		for(int j=0;j<k;j++){
			int sum=0;
			for(int l=0;l<m;l++)
				sum+=a[i][l]*b[l][j];
			ans[i][j]=sum;
		}
	for(int i=0;i<n;i++){ 
		for(int j=0;j<k;j++){
			printf("%d ",ans[i][j]); 
		}
		printf("\n");
	} 
} 
int main(){
	while(~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]);
		solve();
	}
	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 <iostream>
#include <cmath>
using namespace std;
int main()
{
	int m,n,p,k;
	while (cin>>m>>n){
		if (m>n) swap(m,n);
		p=0; k=1;
		k=n-m;
		p=(k*(1+sqrt(5))/2);
		if (p==m)
			cout<<"0\n";
		else
			cout<<"1\n";
	}
	return 0;
} 

G - Matches Game
找规律

#include<bits/stdc++.h>
using namespace std;
int a[100];
int main()
{
	int m;
	while(~scanf("%d",&m))
	{
		int i;
		for(i=0;i<m;i++) scanf("%d",&a[i]);
		int t=0;
		for(i=0;i<m;i++)
		{
			t^=a[i];
		}
		if(t) printf("Yes\n");
		else printf("No\n");
	}
	return 0;
}

H - 互质数的个数(一)
欧拉函数

#include<bits/stdc++.h>
typedef long long LL;
const LL maxa=1e10+10;
LL euler_deall(LL n){
	LL res=n;
	for(LL i=2;i*i<=n;i++){
		if(n%i==0){
			res=res/i*(i-1);
			for(;n%i==0;n/=i);
		}
	}
	if(n!=1)	res=res/n*(n-1);
	return res;
}
int main(){
	int t;
	scanf("%d",&t);
	while(t--){
		LL	n;
		scanf("%lld",&n);
		printf("%lld\n",euler_deall(n));	
	} 
}

I - Sumdiv
因式分解

#include <map>
#include <queue>
#include <string>
#include<iostream>
#include<stdio.h>
#include<string.h>
#include <algorithm>
#include <math.h>
typedef long long ll;
using namespace std;
const int maxn=10100;
#define inf 0x3f3f3f3f
const int mod=9901;
const int MOD=9901;

int n,m;
int dis[maxn],vis[maxn];


/*void prime(){
	for(int i=2;i<maxn;i++)
	{
		if(dis[i]==0) vis[++cnt]=i;
		for(int j=1;j<=cnt&&i*vis[j]<maxn;j++)
		{
			dis[i*vis[j]]=1;
			if(i%vis[j]==0) break;
		}
	}
}*/

ll qpow(ll a, ll b){//快速幂 
	ll sum=1;
	while(b){
		if(b&1) sum=sum*a%MOD;
		b>>=1;
		a=a*a%MOD;
	}
	return sum;
}

ll f(ll a, ll b){
	if(b==0){
		return 1;
	}else if(b%2){
		return (f(a,b/2)*(1+qpow(a,b/2+1)))%MOD;
	}else {
		return (f(a,b/2-1)*(1+qpow(a,b/2+1))+qpow(a,b/2))%MOD;
	}
}


int main() {
	scanf("%d%d",&n,&m);
	int cnt=0;
	for(int i=2;i*i<=n;)//唯一分解定理 
	{
		if(n%i==0){
			dis[cnt]=i;
			vis[cnt]=0;
			while(n%i==0){
				vis[cnt]++;
				n/=i;
			}
			cnt++;
		}
		if(i==2) i++;
		else i+=2;
	}
	
	if(n!=1){
 	dis[cnt]=n;
	vis[cnt++]=1;
 	}
	

	int sum=1;
	for(int i=0;i<cnt;i++){
		sum=(sum*(f(dis[i],vis[i]*m)%MOD))%MOD;
	}
	
	cout<<sum<<endl;
	return 0;
}

J - The Lottery

#include<bits/stdc++.h>
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>
#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;
}

L - 同余方程
拓展欧几里得算法

include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n;
int exgcd(int a,int b,int &x,int &y){
	if(!b){
		x=1,y=0;
		return a;
	}
	int d=exgcd(b,a%b,y,x);
	y-=a/b*x;
	return d;
}
int main(){
		int a,b,m;
		scanf("%d%d",&a,&m);
		b=1;
		int x,y;
		int d=exgcd(a,m,x,y);
		if(b%d)puts("impossible");
		else
		printf("%d\n",(long long)(x*(b/d)+m)%m);
return 0;	
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值