contest 1.17

C.最大公约数II

分解因子+欧拉函数

#include <iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
typedef long long ll;
using namespace std;
 
ll ans1,asn2;
 
ll get_phi(ll x){
    ll ret=x;
    for(ll i=2;i*i<=x;i++)
      if(x%i==0){
        ret/=i,ret*=(i-1);
        while(x%i==0)x/=i;
      }
    if(x>1)ret/=x,ret*=x-1;
    return ret;
}
 
 
int main()
{
    ll n;scanf("%lld",&n);
    ll i;
    ll ans1,ans2;
    for(i=1;i*i<=n;i++){
        if(n%i==0){
            ans1=i;
            ans2=get_phi(n/i);
            printf("%lld %lld
",ans1,ans2);
        }
 
    }
    if(sqrt(n)*sqrt(n)==n) i-=2;
    else i-=1;
    for(i;i>=1;i--){
        if(n%i==0){
            ans1=n/i;
            ans2=get_phi(i);
            printf("%lld %lld
",ans1,ans2);
        }
    }
    return 0;
}
View Code

A.

 dp_0[i]表示长度为i的s[i]与s[i-1]不同且s[i]与s[i+1]相同的无春花串的总数

 dp_1[i]表示长度为i的s[i]与s[i-1]不同且s[i]与s[i+1]不同的无春花串的总数

#include <iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#define mod 1000000007
typedef long long ll;
using namespace std;
 
ll dp_0[100005],dp_1[100005];
ll dp[100005];
 
int main()
{
    ll t;scanf("%lld",&t);
    while(t--){
        ll n,s;scanf("%lld%lld",&n,&s);
        dp_0[0]=1,dp_1[0]=0;dp[0]=1;
        dp_0[1]=0,dp_1[1]=s-1;dp[1]=s-1;
        for(int i=2;i<=n-3;i++){
            dp_0[i]=(dp_0[i-2]+dp_1[i-2])%mod*(s-1)%mod;
            dp_1[i]=(dp_0[i-1]+dp_1[i-1])%mod*(s-1)%mod;
            dp[i]=(dp_0[i]+dp_1[i])%mod;
        }
        ll ans=0;
        for(ll i=0;i<=n-3;i++){
            ans=(ans+dp[i]*dp[n-3-i]%mod*s%mod)%mod;
        }
        printf("%lld
",ans);
    }
    return 0;
}
View Code

F.Mixing Milk II

暴力

#include <iostream>
#include<cstdio>
using namespace std;
 
int main()
{
    int a,x;
    scanf("%d%d",&a,&x);
    int b,y;
    scanf("%d%d",&b,&y);
    int c,z;
    scanf("%d%d",&c,&z);
    for(int i=1;i<=100;i++){
        if(i%3==1){
            if(x+y>b) x-=(b-y),y=b;
            else y+=x,x=0;
        }
        else if(i%3==2){
            if(y+z>c) y-=(c-z),z=c;
            else z+=y,y=0;
        }
        else{
            if(z+x>a) z-=(a-x),x=a;
            else x+=z,z=0;
        }
        //printf("%d %d %d
",x,y,z);
    }
    printf("%d
%d
%d
",x,y,z);
    return 0;
}
View Code

G.The Bucket List

暴力

#include <iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
typedef long long ll;
using namespace std;
 
struct Node{
  int s,t,b;
}node[105];
int vis[1005];
 
bool cmp(Node a,Node b){
  if(a.s!=b.s) return a.s<b.s;
  else return a.t<b.t;
}
 
int main()
{
    int n;scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%d%d%d",&node[i].s,&node[i].t,&node[i].b);
    }
    sort(node+1,node+1+n,cmp);
    int ans=0;
    for(int i=1;i<=n;i++){
        int s=node[i].s;
        int t=node[i].t;
        int b=node[i].b;
        int cnt=0,k=0;
        while(cnt<b){
            k++;
            if(vis[k]<=s) {
                //printf("k=%d vis=%d s=%d
",k,vis[k],s);
                cnt++,vis[k]=t;
            }
            else continue;
        }
        ans=max(ans,k);
    }
    printf("%d
",ans);
    return 0;
}
View Code

A.五子棋

暴力

#include <iostream>
#include<cstdio>
#include<cstring>
using namespace std;
 
int Map[20][20];
int dire[8][2]={-1,-1,-1,0,-1,1,0,1,1,1,1,0,1,-1,0,-1};
 
bool in(int x,int y){
  if(x>=1&&x<=15&&y>=1&&y<=15) return 1;
  return 0;
}
 
bool check(int x,int y,int now){
  int cnt[9];
  for(int i=0;i<8;i++){
    cnt[i]=0;
    int x_=x,y_=y;
    while(in(x_+dire[i][0],y_+dire[i][1])){
        x_=x_+dire[i][0];
        y_=y_+dire[i][1];
        //printf("%d %d %d %d %d %d
",x,y,x_,y_,Map[x_][y_],now);
        if(Map[x_][y_]!=now) break;
        else cnt[i]++;
    }
  }
  if(cnt[0]+cnt[4]+1>=5) return 1;
  if(cnt[1]+cnt[5]+1>=5) return 1;
  if(cnt[2]+cnt[6]+1>=5) return 1;
  if(cnt[3]+cnt[7]+1>=5) return 1;
  return 0;
}
 
int main()
{
    for(int i=1;i<=15;i++){
        for(int j=1;j<=15;j++){
            Map[i][j]=-1;
        }
    }
    int n;scanf("%d",&n);
    int step=0,winner=1;
    for(int i=1;i<=n;i++){
        int x,y;scanf("%d%d",&x,&y);
        if(step) continue;
        Map[x][y]=i%2;
        if(check(x,y,i%2)) step=i,winner=i%2;
    }
    if(!step) puts("Tie");
    else{
        if(winner==1) printf("A ");
        else printf("B ");
        printf("%d
",step);
    }
    return 0;
}
View Code

D.凉宫春日的忧郁

取对数

import java.math.*;
import java.util.Scanner;
 
public class Main {
 
    public static void main(String[] args) {
        Scanner cin=new Scanner(System.in);
        int t=cin.nextInt();
        for(int i=1;i<=t;i++){       
            int x=cin.nextInt();
            int y=cin.nextInt();
            if(y==0) {
                System.out.println("Yes");
                continue;
            }
            double tmp=0;
            for(int j=1;j<=y;j++){
                tmp=tmp+(Math.log10(j*1.0)/Math.log10(Math.E));
            }
            tmp=tmp/y;
            tmp=Math.pow(Math.E, tmp);
            if(x<=tmp) System.out.println("Yes");
            else System.out.println("No");
        }
    }
 
}
View Code

H.Back and Forth

暴力

#include <iostream>
#include<cstdio>
#include<cstring>
#include<map>
using namespace std;
 
int a[20],b[20];
int copa[20],copb[20];
map<int,int> mp;
 
int main()
{
    for(int i=1;i<=10;i++){
        scanf("%d",&a[i]);
        copa[i]=a[i];
    }
    for(int i=1;i<=10;i++){
        scanf("%d",&b[i]);
        copb[i]=b[i];
    }
    int tot=0,ans=0;
    for(int i=1;i<=10;i++){
        tot-=a[i];b[11]=a[i];
        if(i<=9) swap(a[i],a[10]);
        for(int j=1;j<=11;j++){
            tot+=b[j];a[10]=b[j];
            if(j<=10) swap(b[j],b[11]);
            for(int p=1;p<=10;p++){
                tot-=a[p];b[11]=a[p];
                if(p<=9) swap(a[p],a[10]);
                for(int q=1;q<=11;q++){
                    tot+=b[q];a[10]=b[q];
                    if(q<=10) swap(b[q],b[11]);
                    if(!mp[tot]) {
                            //printf("%d %d %d %d ",i,j,p,q);
                            //printf("tot=%d
",tot);
                            mp[tot]=1,ans++;
                    }
                    if(q<=10) swap(b[q],b[11]);
                    tot-=b[q];
                }
                if(p<=9) swap(a[p],a[10]);
                tot+=a[p];
            }
            if(j<=10) swap(b[j],b[11]);
            tot-=b[j];
        }
        if(i<=9) swap(a[i],a[10]);
        tot+=a[i];
    }
    printf("%d
",ans);
    return 0;
}
View Code
转载请注明出处:https://www.cnblogs.com/lllxq/
原文地址:https://www.cnblogs.com/lllxq/p/10280877.html