每天一道蓝桥杯 Day2 翻转+阶乘求和

阶乘求和

 

只要后9位的话,那就只考虑后9位!

如何只算后9位?有一个很经典的运算:取模。

回想入门c语言时做过一道题,给定三位数,要求进行数字翻转。

比如给定n,n=123,要翻转成321。

一个做法是令a1=n%10,a2=(n%100)/10,a3=n/100

输出a1*100+a2*10+a3即可。

所以遇到求一个很大的值除以某数的余数,或者只问后几位是什么时,都可以考虑取模运算。

有一道蓝桥杯的斐波那契题也是这种思想:https://blog.csdn.net/qq_44619221/article/details/104300440

ac代码:

#include<bits/stdc++.h>
using namespace std;
#define int long long
signed main(){
    int a=1;
    int ans=0;
    for(int i=1;i<=100;i++){
        a*=i;
        a%=10000000000000;
        ans+=a%(1000000000);
        ans%=1000000000;
        //cout<<i<<" #"<<(a%(1000000000))<<endl;
    }
    cout<<ans<<endl;
}

 

翻转

简单来说就是每次合法的操作就是每次可以把101变成111,或者010变成000,求s变成t的最小操作数。

最开始想得有点复杂,比如我修改这个位置,是否会影响到其他位,从而导致答案不优?

但是手算了几个样例(自己出几个小样例,然后手算,这是一个很不错的方法,可以帮助发现不少规律~)

发现不用担心这种情况,每次修改和其他位都是独立的

直接模拟即可

#include<bits/stdc++.h>
using namespace std;
#define int long long
signed main(){
    int n;
    cin>>n;
    while(n--){
        string t,s;cin>>t>>s;
        int l=s.length();
        int flag=1,ans=0;
        for(int i=0;i<l;i++){
            if(s[i]!=t[i]){
                if(i==0||i==l-1) flag=0;//如果是首位和末位就一定不合法
               // cout<<s[i-1]<<" "<<s[i]<<" "<<s[i+1]<<endl;
                if(s[i]=='1'){
                    if( s[i-1]!='0' || s[i+1]!='0' ) flag=0;//判断能否翻转
                    else ans++;
                }
                else {
                    if( s[i-1]!='1' || s[i+1]!='1' ) flag=0;
                    else ans++;
                }
            }
        }
        if(flag) cout<<ans<<endl;
        else cout<<-1<<endl;
    }
}

  

 

posted @ 2024-03-08 23:12  liyishui  阅读(14)  评论(0编辑  收藏  举报