Day2 枚举
1.要点
枚举要细致,考虑所有情况,一般为填空题,根据题目选择手算还是机算
Day3 进制转换
进制转换
1.要点
1.任意k进制转换为十进制
输入字符串得到某个k进制数组a(从1开始,长度为n)
ll y=0;
for(int i=1;i<=n;i++){y=y*k+a[i];
}
cout<<y<<"\n";
或直接将k进制数x变成10进制数y(核心product)
ll y=0;
int product=1;//product在循环中不断乘k,1,k,k^2
while(x){y=y+(x%10)*product;//x%10获得个位数字x/=10;product*=k;
}
2.十进制转换为任意k进制
ll x;cin>>x;
int cnt=0;
while(x){a[++cnt]=x%k;x/=k;
}
reverse(a+1,a+1+cnt);//注意要翻转一下,使高位在1的位置,且reverse左开右闭
3.填空题巧法
手算或用pow(a,b) a^b
函数
2.刷题
2022 X 进制减法
难点:
(1)X 进制是一种很神奇的进制, 因为其每一数位的进制并不固定!例如说某 种 XX 进制数, 最低数位为二进制, 第二数位为十进制, 第三数位为八进制, 则 XX 进制数 321 转换为十进制数为 65 。
理解:1权重为1,2权重为2*1
,3权重为10*2*1
,所有1*1+2*2*1+3*10*2*1=65
(不是正常的次方了,就是相乘,进制本质)
(2)
(a + b) % p = (a % p + b % p) % p
(a - b) % p = (a % p - b % p) % p
(a * b) % p = (a % p * b % p) % p
a ^ b % p = ((a % p)^b) % p
所以每一步都要取余1000000007,不然得不了满分
(3)尽量不要涉及数组i+1,最好直接用i
(4)代码:
#include <bits/stdc++.h>using namespace std;typedef long long ll;
const int NN=1e5+9;
const ll mod=1000000007;
int a[NN],b[NN];int main(){ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);int N,Ma,Mb;cin>>N>>Ma;for(int i=Ma;i>=1;i--) cin>>a[i];cin>>Mb;for(int i=Mb;i>=1;i--) cin>>b[i];ll res=0,weight=1;int jinzhi=2;for(int i=1;i<=Ma;i++){jinzhi=max(2,max(a[i],b[i])+1);//记得都要除以mod res=(res+(a[i]-b[i])*weight)%mod;weight=(weight*jinzhi)%mod;}res%=mod;cout<<res;return 0;
}