算法总结—最小公倍数+取模
\text{GCD}
\text{GCD} 的几个公式:
-
\gcd(x,y)\times\text{lcm}(x,y)=xy -
\gcd(x,y)=\gcd(y,x) -
\gcd(a_1,a_2,...,a_n)\leq\min\{a_i\} -
\gcd(x,y)=\gcd(y,x\bmod y)
由第四条公式我们可以得出求两数最大公约数的代码:
int gcd(int x,int y){
if(y==0){
return x;
}
return gcd(y,x%y);
}
文文的数学游戏
第一问
根据
第二问
由于每一个
记得取模,记得开 long long 。
代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
int a[100005];
const int mod=1e9+7;
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);
int n;
cin>>n;
int cnt=1;
int Min=1e18;
for(int i=1;i<=n;i++){
cin>>a[i];
Min=min(Min,a[i]);
}
for(int i=1;i<=n;i++){
cnt*=a[i]/Min;
cnt%=mod;
}
cout<<Min<<" "<<cnt;
return 0;
}
\text{Change}
由于初始值为 No ,其余情况输出 Yes 。
代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
signed main(){
int T;
cin>>T;
while(T--){
int p,a,b,c;
cin>>p>>a>>b>>c;
if(b==0&&c!=0){
cout<<"No\n";
continue;
}
cout<<"Yes\n";
}
return 0;
}
\text{Running}
这道题中的
代码
#include<iostream>
#include<algorithm>
#define int long long
using namespace std;
int gcd(int x,int y){
if(y==0){
return x;
}
return gcd(y,x%y);
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);
int n;
cin>>n;
int ans=0;
for(int i=1;i<=n;i++){
int x;
cin>>x;
if(x%2==1){
cout<<-1;
return 0;
}
ans=gcd(ans,x/2);
}
cout<<ans;
return 0;
}
取模
模法公式:
int add(int x,int y){//加
return ((x%mod)+(y%mod))%mod;
}
int sub(int x,int y){//减
return ((x%mod)-(y%mod)+mod)%mod;
}
int mul(int x,int y){//乘
return ((x%mod)*(y%mod))%mod;
}
\text{The\ Grand\ Farm-off\ S}
这道题有两个公式:
这道题要是硬算肯定会爆 long long ,于是我们根据模法公式一步步算出来:
- 算出
i^5 。 - 算出
a\times i^5 。 - 算出
i^2 。 - 算出
b\times i^2 。 - 将
a\times i^5,b\times i^2,c 加起来。 计算U_i 同理。
嘴里用结构体排序:
有用度相等按照体重从轻到重排,否则按照有用都从大到小排。
代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n;
int a,b,c,d,e,f,g,h;
int mod;
struct node{
int w,val;
}pre[1500005];
bool cmp(node q,node h){
if(q.val==h.val){
return q.w<h.w;
}
return q.val>h.val;
}
int MUL(int a,int b){
return ((a%d)*(b%d))%d;
}
int ADD(int a,int b){
return ((a%d)+(b%d))%d;
}
int MUL_(int a,int b){
return ((a%h)*(b%h))%h;
}
int ADD_(int a,int b){
return ((a%h)+(b%h))%h;
}
int add(int a,int b){
return ((a%mod)+(b%mod))%mod;
}
signed main(){
cin>>n;
cin>>a>>b>>c>>d>>e>>f>>g>>h;
cin>>mod;
int N=n*3;
for(int i=0;i<N;i++){
int I=MUL(i,i);
I=MUL(I,i);
I=MUL(I,i);
I=MUL(I,i);
int A=MUL(a,I);
I=MUL(i,i);
int B=MUL(b,I);
int C=c;
pre[i].w=ADD(ADD(A,B),C);
}
for(int i=0;i<N;i++){
int I=MUL_(i,i);
I=MUL_(I,i);
I=MUL_(I,i);
I=MUL_(I,i);
int E=MUL_(e,I);
I=MUL_(i,i);
I=MUL_(I,i);
int F=MUL_(f,I);
int G=g;
pre[i].val=ADD_(ADD_(E,F),G);
}
sort(pre,pre+N,cmp);
int cnt=0;
for(int i=0;i<n;i++){
cnt=add(cnt,pre[i].w);
}
cout<<cnt;
return 0;
}