735D - Taxes 哥德巴赫猜想,1303C - Perfect Keyboard,P2455 [SDOI2006]线性方程组

118 阅读2分钟

735D - Taxes 哥德巴赫猜想

 哥德巴赫猜想:任何大于等于4的偶数可以表示成两个素数的和。

然后这题就做完了,,,

是偶数除了2答案是1外别的都是2,奇数的话先看是不是素数,不是的话就看看n-2是不是素数,再不行那答案就是3了,3,n-3,因为n-3是偶数所以答案是3

(1条消息) D. Taxes(哥德巴赫猜想)_·马克图布·的博客-CSDN博客

ll n;
bool su(ll x){
    for(int i=2;i<=sqrt(x);i++)
        if(x%i==0) return 0;
    return 1;
}
int main(){
    scanf("%lld",&n);
    if(n==2) printf("1\n");
    else{
        if(n&1){
            if(su(n)) printf("1\n");
            else if(su(n-2)) printf("2\n");
            else printf("3\n");
        }
        else printf("2\n");
    }
    return 0;
}

1303C - Perfect Keyboard

可以发现一般情况下只有当有两个字母只和1个相邻也就是入度为1,其他的字母都是和2个相邻也就是入度为2时才会有解,然后就是先从度数为1的开始,然后一直遍历到度数为1的结束,然后在把剩下的字母给输出就可以,模拟这个思路就像,特判就是|s|==1的时候

ll t,in[30];
char s[205];
vector<char>v[30];
bool vis[30][30];
map<char,bool>mp;
int main(){
    scanf("%lld",&t);
    while(t--){
        scanf("%s",s+1);
        ll n=strlen(s+1);
        if(n==1){
            cout<<"YES\n"<<s[1];
            for(char i='a';i<='z';i++)
                if(i!=s[1]) cout<<i;
            printf("\n");
            continue;
        }
        mp.clear();
        for(int i=1;i<=26;i++) in[i]=0,v[i].clear();
        for(int i=1;i<=26;i++)
            for(int j=1;j<=26;j++) vis[i][j]=0;
        for(int i=2;i<=n;i++){
            if(!vis[s[i]-'a'+1][s[i-1]-'a'+1]){
                vis[s[i]-'a'+1][s[i-1]-'a'+1]=vis[s[i-1]-'a'+1][s[i]-'a'+1]=1;
                v[s[i]-'a'+1].push_back(s[i-1]);
                v[s[i-1]-'a'+1].push_back(s[i]);
                in[s[i]-'a'+1]++;
                in[s[i-1]-'a'+1]++;
            }
        }
        ll flag=0,ma=0;
        for(int i=1;i<=26;i++){
            if(in[i]==1) flag++,ma=i;
            else if(in[i]>2){
                flag=0;break;
            }
        }
        if(flag!=2){printf("NO\n");continue;}
        printf("YES\n");
        while(1){
            ll fg=0;
            cout<<(char)(ma-1+'a');
            mp[(char)(ma-1+'a')]=1;
            for(int i=0;i<v[ma].size();i++){
                char j=v[ma][i];
                if(mp[j]) continue;
                ma=j-'a'+1;
                fg=1;
                break;
            }
            if(!fg) break;
        }
        for(char i='a';i<='z';i++)
        if(!mp[i]){cout<<i;mp[i]=1;}
        printf("\n");
    }
    return 0;
}

P2455 [SDOI2006]线性方程组 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 高斯消元

这题多了个无穷解的判断,需要对模板做一些调整,如果这一列都是0的话,那么应该去下一列再去进行原来的操作,如果遍历完之后发现用的行数少于n那么就一定是特殊情况,因为只要有一个主元是0就是无解,所以先判无解,然后如果b都是0的话那就是无穷解

题解 P2455 【[SDOI2006]线性方程组】 - Piwry - 洛谷博客

ll n;
double a[110][110];
int main(){
    scanf("%lld",&n);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n+1;j++)
        scanf("%lf",&a[i][j]);
    ll nwline=1;
    for(int k=1;k<=n;k++){
        ll p=nwline;
        for(int i=nwline+1;i<=n;i++)
            if(fabs(a[p][k])<fabs(a[i][k])) p=i;
        if(a[p][k]==0) continue;
        swap(a[nwline],a[p]);
        for(int i=1;i<=n;i++){
            if(i==nwline) continue;
            double tmp=a[i][k]/a[nwline][k];
            for(int j=k+1;j<=n+1;j++)
                a[i][j]-=a[nwline][j]*tmp;
        }
        nwline++;
    }
    if(nwline<=n){
        while(nwline<=n)
        if(a[nwline++][n+1]!=0){printf("-1\n");return 0;}
        printf("0\n");return 0;
    }
    for(int i=1;i<=n;i++)
        printf("x%lld=%.2lf\n",i,a[i][n+1]/a[i][i]);
    return 0;
}