• 2019国赛


     思想:dfs

    答案:

    55965365465060

    #include<iostream>
    #include<stdio.h>
    #include<string.h>
    #include<vector>
    using namespace std;
    typedef long long ll;
    const int maxn = 3000;
    ll f[maxn][maxn];//用long long 
    vector<int>prime;
    bool vis[10000];
    void init(){//素数筛 
        for(int i = 2;i<= 3000;i++) {
            if(!vis[i]) {
                for(int j = i*i;j<= 3000;j+= i) {
                    vis[j] = true;
                }
            }
        }
     for(int i = 2;i<= 2019;i++) {
            if(!vis[i]) prime.push_back(i);
        }
    }
    
     
    ll dfs(int pos,int sum) {
        if(f[pos][sum]!= -1) return f[pos][sum];
        if(sum == 2019) return 1;
        if(pos>= prime.size()||sum> 2019) return 0;
        ll ans = 0;
        ans+= dfs(pos+1,sum);// 不要当前这个素数
        ans+= dfs(pos+1,sum+prime[pos]);// 要当前这个素数
        return f[pos][sum] = ans;
    }
    int main(){
        init();
        memset(f,-1,sizeof(f));
        ll ans = dfs(0,0);
        cout<<ans<<endl;
        return 0;
    } 

     代码:

    #include<iostream>
    #include<stdio.h>
    #include<vector>
    using namespace std;
    typedef long long ll;
    bool vis[100000];
    vector<int>prime;
    
    void init(){
        for(int i=2;i<=10000;i++){
            if(!vis[i]){
                for(int j=i*i;j<=10000;j+=i){
                    vis[j]=true;
                }
            }
        }
        for(int i=2;i<=10000;i++){
            if(!vis[i]){
                prime.push_back(i);
            }
        }
        return ;
    }
    
    ll cal(int n){
        ll ans=1;
        for(int i=0;i<prime.size();i++){
            int cnt=0;
            while(n%prime[i]==0){
                cnt++;
                n = n/prime[i];
            }
            ans = ans*(cnt+1);
        }
        return ans;
    }
    
    int main(){
        init();
        for(int i=99;i<=1000000;i++){
            if(cal(i)==100){
                cout<<i<<endl;
                break;
            }
        }
        return 0;
    } 

    代码:

    #include<iostream>
    #include<stdio.h>
    using namespace std;
    int vis[8][8];
    int dx[4]={1,-1,0,0},dy[4]={0,0,1,-1};
    int ans;
    void dfs(int x,int y,int len){
        if(len>2&&len<=12&&x==0&&y==0){
            ans++;
            return ;
        }    
        for(int i=0;i<4;i++){
            int nx =x+dx[i];
            int ny =y+dy[i];
            if(nx<0||nx>7||ny<0||ny>7) continue;
            if(!vis[nx][ny]&&len<=12){
                vis[nx][ny] =1;
                dfs(nx,ny,len+1);
                vis[nx][ny] = 0;
            }
        }    
    }
    
    int main(){
        dfs(0,0,0);
        cout<<ans<<endl;
        return 0; 
    }
  • 相关阅读:
    计算机中最重要的两个硬件是什么它们如何相互作用。
    音乐光盘
    下列各项包含多少位?
    下列包含多少字节?
    自测题‘
    自测题.
    python 并发编程多线程之进程池/线程池
    python 并发编程之多线程
    基于解决高并发生的产者消费者模型
    守护进程、互斥锁、进程间通信(IPC机制)
  • 原文地址:https://www.cnblogs.com/lusiqi/p/13953656.html
Copyright © 2020-2023  润新知