幂取模
#include<cstdio>
using namespace std;
long long a,b,p,ans=1;
long long qpow(long long a,long long b,long long p){
while(b>0){
if(b%2==1){
ans=(ans*a)%p;
}
a=(a*a)%p;
b>>=1;//等于b=b/21或b=b>>1
}
return ans;
}
int main(){
scanf("%d%d%d",&a,&b,&p);
long long s=qpow(a,b,p);
printf("%d",s);
return 0;
}
矩阵置0
#include<iostream>
using namespace std;
int main(){
int n,m;
int cnt=0;
bool f=0;
cin>>n>>m;
int a[305][305],b[305],c[305];
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>a[i][j];
if(a[i][j]==0){
b[cnt]=i;
c[cnt]=j;
cnt++;
}
}
}
for(int i=0;i<cnt;i++){
for(int j=1;j<=m;j++){
a[b[i]][j]=0;
}
for(int j=1;j<=n;j++){
a[j][c[i]]=0;
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cout<<a[i][j]<<" ";
}
cout<<endl;
}
return 0;
}
查找特殊的点
#include<iostream>
using namespace std;
const int inf=0x3f3f3f;
int a[10][10],x[10],y[10],f=1,cnt;
int main(){
for(int i=1;i<=5;i++){
x[i]=-inf;
for(int j=1;j<=5;j++){
cin>>a[i][j];
if(a[i][j]>x[i]){
x[i]=a[i][j];
}
}
}
for(int i=1;i<=5;i++){
y[i]=inf;
for(int j=1;j<=5;j++){
if(a[j][i]<y[i]){
y[i]=a[j][i];
}
}
}
for(int i=1;i<=5;i++){
int n=x[i];
for(int j=1;j<=5;j++){
if(y[j]==n){
cout<<i<<" "<<j<<" "<<n;
f=0;
break;
}
}
}
if(f==1){
cout<<"not found";
}
return 0;
}
矩阵运算
#include<iostream>
using namespace std;
int n[210][210],m[210][210],z[210][210],a,b,c;
int main(){
cin>>a>>b>>c;
for(int i=1;i<=a;i++){
for(int j=1;j<=b;j++){
cin>>m[i][j];
}
}
for(int i=1;i<=b;i++){
for(int j=1;j<=c;j++){
cin>>n[i][j];
}
}
for(int i=1;i<=a;i++){
for(int j=1;j<=c;j++){
for(int k=1;k<=b;k++){
z[i][j]+=m[i][k]*n[k][j];
}
}
}
for(int i=1;i<=a;i++){
for(int j=1;j<=c;j++){
cout<<z[i][j]<<" ";
}
cout<<endl;
}
return 0;
}
唯一分解定理
#include<iostream>
#include<cmath>
using namespace std;
int b[1100000],cnt,n,m;
void w(int n){
int m=sqrt(n);
for(int i=2;i<=m;i++){
while(n%i==0){
b[++cnt]=i;
n/=i;
}
}
if(n>1){
b[++cnt]=n;
}
}
int main(){
cin>>n;
w(n);
cout<<cnt<<endl;
for(int i=1;i<=cnt;i++){
cout<<b[i]<< " ";
}
return 0;
}
乘积为n的素数
#include<iostream>
#include<cmath>
using namespace std;
int b[1100000],cnt,n,m;
void w(int n){
int m=sqrt(n);
for(int i=2;i<=m;i++){
while(n%i==0){
b[++cnt]=i;
n/=i;
}
}
if(n>1){
b[++cnt]=n;
}
}
int main(){
cin>>n;
w(n);
cout<<cnt<<endl;
for(int i=1;i<=cnt;i++){
cout<<b[i]<< " ";
}
return 0;
}
LCM为n的最小因子和
#include<iostream>
#include<cmath>
using namespace std;
int b[1000000],n,cnt,sum;
int main(){
cin>>n;
int m=sqrt(n);
for(int i=2;i<=m;i++){
if(n%i==0){
b[++cnt]=1;
while(n%i==0){
b[cnt]*=i;
n/=i;
}
}
}
if(n>1){
b[++cnt]=n;
}
if(cnt==1){
cout<<n+1;
}
else{
for(int i=1;i<=cnt;i++){
sum+=b[i];
}
cout<<sum;
}
return 0;
}
出现次数最多的素因子
#include <iostream>
#include <cmath>
using namespace std;
int b[100010],p[100010],cnt,n,m,maxx=0,maxxx=0;
void w(int n){
int m=sqrt(n);
for(int i=2;i<=m;i++){
if(n%i==0){
b[++cnt]=i;
while(n%i==0){
n/=i;
p[cnt]++;
}
}
}
if(n>1){
b[++cnt]=n;
p[cnt]=1;
}
}
int main(){
cin>>n;
w(n);
for(int i=1;i<=cnt;i++){
if(maxx<=p[i]){
maxx=p[i];
maxxx=b[i];
}
}
cout<<maxxx;
return 0;
}
计算概率
#include<iostream>
#include<iomanip>
#include<cmath>
#include<string>
#include<algorithm>
#include<cstdio>
#include<queue>
#include<map>
#include<vector>
using namespace std;
long long sum,a[210000];
int main(){
long long n,l;
cin>>n>>l;
for(int i=1;i<=n;i++){
cin>>a[i];
}
sort(a+1,a+n+1);
int i=1,j=n;
while(i<j){
if(a[i]+a[j]<=l){
sum+=(j-i);
i++;
}
else{
j--;
}
}
double h=n*(n-1)/2;
printf("%.2lf",1.0*sum/h);
return 0;
}
求正约数的个数
#include<iostream>
#include<cmath>
using namespace std;
long long ans=1,a[11000],p[11000];
int main(){
long long n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>p[i]>>a[i];
ans*=(a[i]+1);
}
cout<<ans;
return 0;
}
约数个数
#include<iostream>
#include<cmath>
#include<cstring>
using namespace std;
typedef long long ll;
const int N=1e6+10;
ll s[N],p[N],cnt,n;
ll b[N];
void ola(){
for(int i=2;i<=N-1;i++){
if(!s[i]){
p[++cnt]=i;
}
for(int j=1;j<=cnt&&p[j]<=N/i;j++){
s[p[j]*i]=1;
if(i%p[j]==0){
break;
}
}
}
}
void w(int n){
for(int i=1;i<=cnt&&p[i]<=n;i++){
while(n%p[i]==0){
n=n/p[i];
b[i]++;
}
}
if(n>1){
p[++cnt]=n;
b[cnt]=1;
}
}
int main(){
ola();
while(cin>>n){
long long fac=1;
memset(b,0,sizeof b);
w(n);
for(int i=1;i<=cnt;i++){
if(b[i]!=0){
fac*=(b[i]+1);
}
}
cout<<fac<<endl;
}
return 0;
}
求约数之和
#include<iostream>
#include<cmath>
using namespace std;
typedef long long ll;
const int N=1e6+10;
const int M=1e9+7;
ll s[N],p[N],cnt,n,fac=1;
ll a[N],b[N];
void ola(){
for(int i=2;i<=N-1;i++){
if(!s[i]){
p[++cnt]=i;
}
for(int j=1;j<=cnt&&p[j]<=N/i;j++){
s[p[j]*i]=1;
if(i%p[j]==0){
break;
}
}
}
}
void w(int n){
for(int i=1;i<=cnt&&p[i]<=n;i++){
while(n%p[i]==0){
n=n/p[i];
b[i]++;
}
}
if(n>1){
p[++cnt]=n;
b[cnt]=1;
}
}
int main(){
cin>>n;
ola();
for(int i=1;i<=n;i++){
cin>>a[i];
w(a[i]);
}
for(int i=1;i<=cnt;i++){
if(b[i]!=0){
ll sum=1,num=1;
for(int j=1;j<=b[i];j++){
num=num*p[i]%M;
sum=(sum+num)%M;
}
fac=fac*sum%M;
}
}
cout<<fac;
return 0;
}
sum
#include<iostream>
#include<iomanip>
using namespace std;
long long sum[110000],a[110000],n,m,t;
int main(){
cin>>t;
while(t--){
long long f[110000]={0};
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
sum[i]=sum[i-1]+a[i];
}
if(n>=m){
cout<<"YES"<<endl;
}
else {
int flag=0;
for(int i=1;i<=n;i++){
f[sum[i]%m]++;
if(sum[i]%m==0){
flag=1;
break;
}
if(f[sum[i]%m]>1){
flag=1;
break;
}
}
if(flag==1){
cout<<"YES"<<endl;
}
else{
cout<<"NO"<<endl;
}
}
}
return 0;
}
吃糖果
#include<iostream>
#include<iomanip>
#include<algorithm>
using namespace std;
long long a[1100000],n,t;
int main() {
cin>>t;
while(t--) {
int sum=0;
int maxx=-1;
cin>>n;
for(int i=1; i<=n; i++) {
cin>>a[i];
}
sort(a+1,a+n+1);
maxx=a[n];
for(int i=1; i<=n-1; i++) {
sum+=a[i];
}
if(sum>=maxx-1) {
cout<<"Yes"<<endl;
} else {
cout<<"No"<<endl;
}
}
return 0;
}
Boxes
#include<iostream>
#include<iomanip>
using namespace std;
long long n,a,b,fac1=1,fac2=1,fac3=1,sum=1,ans=1;
int main(){
cin>>n>>a>>b;
int maxx=max(a,b);
for(int i=1;i<=maxx;i++){//拿i个球
fac1=fac1*(n+i-1)/i;
sum+=fac1;
if(i==a){//红球拿完了
ans*=sum;
}
if(i==b){
ans*=sum;
}
}
cout<<ans;
return 0;
}
前缀和
#include<iostream>
#include<iomanip>
using namespace std;
long long sum[1100000],a[1100000],n,q;
int main(){
cin>>n>>q;
for(int i=1;i<=n;i++){
cin>>a[i];
sum[i]=sum[i-1]+a[i];
}
int l,r;
for(int i=1;i<=q;i++){
cin>>l>>r;
cout<<sum[r]-sum[l-1];
}
return 0;
}
求多组组合数
#include<iostream>
#include<iomanip>
#include<cmath>
#include<string>
#include<algorithm>
#include<cstdio>
#include<queue>
#include<map>
#include<vector>
#include<stack>
using namespace std;
int a[1100][1100],k,n,m;
int main() {
a[1][1]=1;
for(int i=2; i<=1001; i++) {
for(int j=1; j<=i; j++) {
a[i][j]=(a[i-1][j-1]+a[i-1][j])%10007;
}
}
cin>>k;
for(int i=1; i<=k; i++) {
cin>>n>>m;
cout<<a[n+1][m+1]<<endl;
}
return 0;
}
阶乘分解
#include<iostream>
using namespace std;
const int N=1e6+5;
int s[N],p[N],cnt,n;
void ola(){
for(int i=2;i<=N;i++){
if(s[i]==0){
p[cnt++]=i;
}
for(int j=0;p[j]<=N/i;j++){
s[p[j]*i]=1;
if(i%p[j]==0){
break;
}
}
}
}
int main(){
int n;
cin>>n;
ola();
for(int i=0;i<cnt&&p[i]<=n;i++){
int y=n;
int sum=0;
while(y){
sum+=y/p[i];
y/=p[i];
}
cout<<p[i]<<" "<<sum<<endl;
}
return 0;
}
求组合数-大数
#include<iostream>
#include<vector>
using namespace std;
const int N=1e9 + 7;
vector<int> b;
void p(int n) {
int m=sqrt(n);
for(int i=2; i<=m; i++) {
while(n%i==0) {
b[++cnt]=i;
n/=i;
}
}
if(n>1) {
b[++cnt]=n;
}
}
int d(int n, int m) {
int pow = 0;
while (n>=m) {
int t=n/m;
pow=t;
n=t;
}
return pow;
}
int C(int n, int m) {
long long ans = 1;
vector<int> v = p(n);
for (int i = 0; i < v.size(); i++) {
int k = v.at(i),pow;
pow = d(n, k) - d(m, k) - d(n - m, k);
for (int j=0; j<pow; j++) {
ans *= k;
ans =ans%N;
}
}
return (int)ans;
}
int main() {
int n,m;
while (cin>>n>>m) {
cout << C(n, m) << endl;
}
return 0;
}
划分地盘
#include<iostream>
using namespace std;
int fun(int a,int b){
if(a%b==0){
return a/b;
}
else{
return a/b+fun(b,a%b);
}
}
int main(){
int a,b;
cin>>a>>b;
cout<<fun(a,b);
return 0;
}
位数问题-奇数
#include<iostream>
#include<vector>
using namespace std;
int os[1005]={0,9,73},js[1005]={0,1,17};
int main() {
int n;
cin>>n;
for(int i=3;i<=n;i++){
js[i]=(js[i-1]*9+os[i-1]*1)%12345;
os[i]=(os[i-1]*9+js[i-1]*1)%12345;
}
cout<<js[n];
return 0;
}
位数问题-偶数
#include<iostream>
#include<vector>
using namespace std;
int os[1005]={0,9,73},js[1005]={0,1,17};
int main() {
int n;
cin>>n;
for(int i=3;i<=n;i++){
js[i]=(js[i-1]*9+os[i-1]*1)%12345;
os[i]=(os[i-1]*9+js[i-1]*1)%12345;
}
cout<<os[n];
return 0;
}
昆虫繁殖
#include<iostream>
using namespace std;
long long a[101],b[101];
int main(){
long long x,y,z;
cin>>x>>y>>z;
for(int i=1;i<=x;i++){
a[i]=1;
b[i]=0;
}
for(int i=x+1;i<=z+1;i++){
b[i]=y*a[i-x];
a[i]=a[i-1]+b[i-2];
}
cout<<a[z+1]<<endl;
return 0;
}
踩方格
#include<iostream>
#include<cstdio>
using namespace std;
int main(){
int n;
int s[25],d[25],z[25];
s[1]=1;
d[1]=1;
z[1]=1;
cin>>n;
for(int i=2;i<=n;i++){
s[i]=s[i-1]+d[i-1]+z[i-1];
d[i]=d[i-1]+s[i-1];
z[i]=z[i-1]+s[i-1];
}
cout<<s[n]+d[n]+z[n];
return 0;
}
判断元素是否存在
#include<iostream>
#include<cstdio>
using namespace std;
bool fun(int x,int k){//所有返回值都是0或1
if(x==2*k+1||x==3*k+1){
return 1;
}
if(x>2*k+1){
return fun(x,(2*k+1))||fun(x,(3*k+1));
}
if(x>3*k+1){
return fun(x,(3*k+1));
}
if(x<2*k+1){
return 0;
}
}
int main(){
int k,x;
scanf("%d,%d",&k,&x);
if(x==k){
cout<<"YES";
}
else if(x>k){
if(fun(x,k)==1){
cout<<"YES";
}
else if(fun(k,x)==0){
cout<<"NO";
}
}
else if(x<k){
cout<<"NO";
}
return 0;
}
Pell数列
#include<iostream>
using namespace std;
const int N=1e6;
int a[N];
int main(){
int n,m;
a[1]=1;
a[2]=2;
for(int i=3;i<=N;i++){
a[i]=(2*a[i-1]+a[i-2])%32767;
}
cin>>n;
for(int i=1;i<=n;i++){
cin>>m;
cout<<a[m]<<endl;
}
return 0;
}
TYK开店
#include<iostream>
#include<algorithm>
using namespace std;
int n,m,a[110000];
int fun(int mid){
int f=a[1];//上家店开在哪
int cnt=1;
for(int i=2;i<=n;i++){
if(a[i]-f>=mid){
cnt++;
f=a[i];
}
}
return cnt;
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
}
sort(a+1,a+n+1);
int l=0,r=a[n]-a[1];
while(l<r){
//long long mid(l+r+1)/2;
int mid=l+(r-l+1)/2;
if(fun(mid)>=m){
l=mid;
}
else{
r=mid-1;
}
}
cout<<l;
return 0;
}
数的范围
#include<iostream>
#include<algorithm>
using namespace std;
int n,a[110000],q,k;
int main(){
cin>>n>>q;
for(int i=0;i<n;i++){
cin>>a[i];
}
while(q--){
cin>>k;
int l=0,r=n-1;
while(l<r){
int mid=(l+r)>>1;
if(a[mid]>= k){
r=mid;
}
else {
l=mid+1;
}
}
if(a[l]!=k){
cout<<"-1"<<" "<<"-1"<<endl;
continue;
}
cout<<l<<" ";
l=0,r=n-1;
while(l<r){
int mid=(l+r+1)>>1;
if(a[mid]<=k){
l=mid;
}
else {
r=mid-1;
}
}
cout<<r<<endl;
}
return 0;
}
数的三次方根
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int main(){
double n;
cin>>n;
double l=-10000;
double r=10000;
while(r-l>0.0000001){
double mid=(l+r)/2;
if(mid*mid*mid<=n){
l=mid;
}
else{
r=mid;
}
}
printf("%.6lf",l);
return 0;
}
X星球的翻译官
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<map>
#include<string>
using namespace std;
int main(){
int n,m;
cin>>n>>m;
map<string,string>mp;
string s,a,d;
for(int i=1;i<=n;i++){
cin>>s>>a;
mp[s]=a;
}
for(int i=1;i<=m;i++){
cin>>d;
if(mp.count(d)==1){
cout<<mp[d];
}
else{
int len=d.size();
for(int j=0;j<len;j++){
cout<<"*";
}
}
cout<<" ";
}
return 0;
}
永无休止的小明
#include<iostream>
using namespace std;
int main(){
int n;
cin>>n;
if(n==1){
cout<<"你猜";
return 0;
}
else if(n%2!=0){
for(int i=1;i<=n/2;i++){
cout<<"你猜";
cout<<"我猜";
}
cout<<"你猜";
cout<<"不猜";
return 0;
}
else if(n%2==0){
for(int i=1;i<=n/2;i++){
cout<<"你猜";
cout<<"我猜";
}
cout<<"不猜";
}
return 0;
}
64位整数乘法
#include<iostream>//龟速乘
using namespace std;
long long a,b,p,ans=0;
long long an(long long a,long long b){
while(b!=0){
if(b%2==1){
ans=(ans+a)%p;
}
b/=2;
a=(a*2)%p;
}
return ans;
}
int main(){
cin>>a>>b>>p;
an(a,b);
cout<<ans;
return 0;
}
取模运算
#include<iostream>//快速幂
using namespace std;
long long b,p,k,ans=1;
long long a(long long b,long long p){
while(p!=0){
if(p%2==1){
ans=(ans*b)%k;
}
p=p/2;
b=(b*b)%k;
}
return ans;
}
int main(){
cin>>b>>p>>k;
a(b,p);
cout<<ans;
return 0;
}
光荣的梦想
#include<iostream>
using namespace std;
int main(){
int n,a[11000],cnt=0;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=n-1;i++){
for(int j=1;j<=n-1;j++){
if(a[j]>a[j+1]){
swap(a[j],a[j+1]);
cnt++;
}
}
}
cout<<cnt;
return 0;
}
无平方因子数
#include<iostream>
using namespace std;
const int N=1e7+10;
long long n,m,sum=0;
int s[N],p[N],cnt=0;
void ola(int n){
s[0]=s[1]=1;
for(int i=2;i<=n;i++){
if(s[i]==0){//是素数,存进去
p[cnt++]=i;
}//遍历素数表
for(int j=0;j<cnt&&p[j]*i<=n;j++){
s[p[j]*i]=1;
if(i%p[j]==0){
break;
}
}
}
}
int main(){
cin>>n>>m;
ola(m);
for(int i=n;i<=m;i++){
bool f=0;
for(int j=0;p[j]*p[j]<=i;j++){
if(i%(p[j]*p[j])==0){
f=1;
break;
}
}
if(f==0){
sum++;
}
}
cout<<sum;
return 0;
}
2的幂次方表示
#include<iostream>
#include<cmath>
using namespace std;
void fun(int n){
if(n==1){
cout<<"2(0)";
return ;
}
if(n==2){
cout<<"2";
return ;
}
if(n==3){
cout<<"2+2(0)";
return ;
}
int cnt=0;
while(pow(2,cnt)<=n){//2的几次方等于n
cnt++;
}
cnt--;
cout<<"2(";
fun(cnt);
cout<<")";
if(n!=pow(2,cnt)){
cout<<"+";
fun(n-pow(2,cnt));
}
}
int main(){
int n;
cin>>n;
fun(n);
return 0;
}