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;
}