1002:
最简单的题
模拟就ok
当时我还卡了
因为想暴力,枚举2-16进制
然后爆
仔细一想不需要
学到了isdigit函数可以判断数字
isalpha函数可以判断字母
#include<bits/stdc++.h>
using namespace std;
string ss,num1,num2,num3;
char x;
int minr;
void get_num()
{
int now=1;
for (char c:ss)
{
if (!isdigit(c) && !isalpha(c))
{
now++;
if (c!='=') x=c;
}
else
{
if (isdigit(c))
minr=max(minr,c-'0'+1);
else
minr=max(minr,c-'A'+11);
if (now==1)
num1+=c;
else if(now==2)
num2+=c;
else
num3+=c;
}
}
}
long long cal(string s,int r)
{
long long re=0;
for (char c:s)
{
if (isdigit(c))
re=re*r+c-'0';
else
re=re*r+c-'A'+10;
}
return re;
}
void init()
{
num1.clear();
num2.clear();
num3.clear();
minr=2;
}
bool check(int r)
{
long long t1=cal(num1,r);
long long t2=cal(num2,r);
long long t3=cal(num3,r);
if (x=='+')
return t1+t2==t3;
if (x=='-')
return t1-t2==t3;
if (x=='*')
return t1*t2==t3;
if (t2==0)
return false;
if (t1%t2)
return false;
return t1/t2==t3;
}
int get_ans()
{
for (int i=minr;i<=16;i++)
{
if (check(i))
return i;
}
return -1;
}
int main()
{
while (cin>>ss)
{
init();
get_num();
cout<<get_ans()<<endl;
}
getchar(); getchar();
return 0;
}
1009:
这道题才是最简单的
当时做的思路很简单
列出所有情况并做出合理推导
发现b-1%x就可以判断了
代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int t;
cin>>t;
while(t--)
{
long long b,x;
cin>>b>>x;
if((b-1)%x)
cout<<'F'<<endl;
else
cout<<'T'<<endl;
}
return 0;
}
跟标程差不多吧
但是思想完全不一样
1006:
通过读题,题目描述的是图
带值带权的图
要求其最小生成树
而每条道路权2i
看出路越短越好
因为2i>2i-1
2i=2*2i-1
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod = 1e9+7;
const int maxn = 1e5+10;
int n,m;ll ans=0;
int zero=0,one=0;
vector<pair<int,ll>>G[maxn];
int dp[maxn][2],col[maxn],f[maxn];
void dfs(int u,int f){
dp[u][0]=dp[u][1]=0;
dp[u][col[u]]++;
for(auto it:G[u]){
int v=it.first;
if(v==f)continue;
dfs(v,u);
dp[u][0]+=dp[v][0];
dp[u][1]+=dp[v][1];
}
for(auto it:G[u]){
int v=it.first;
if(v==f)continue;
ans=(ans+1ll*dp[v][0]*(one-dp[v][1])%mod*it.second)%mod;
ans=(ans+1ll*dp[v][1]*(zero-dp[v][0])%mod*it.second)%mod;
}
}
int find(int x){return f[x]==x?x:(f[x]=find(f[x]));}
int main(){
int T;cin>>T;
while(T--){
ans=0,zero=one=0;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)dp[i][0]=dp[i][1]=0,G[i].clear();
for(int i=1;i<=n;i++)scanf("%d",&col[i]),f[i]=i;
for(int i=1;i<=n;i++){
if(col[i])one++;
else zero++;
}
ll val=1;
for(int i=1;i<=m;i++){
int u,v;scanf("%d%d",&u,&v);
val=val*2%mod;
int fu=find(u),fv=find(v);
if(fu==fv)continue;
f[fu]=fv;
G[u].push_back(make_pair(v,val));
G[v].push_back(make_pair(u,val));
}
dfs(1,-1);
printf("%lld\n",ans);
}
}