每天一道蓝桥杯 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; } }