2022/5/6

142 篇文章 1 订阅
142 篇文章 0 订阅

Collision - 题目 - Daimayuan Online Judge

一开始看题意很像最短路,想着是求c到d的一半长度然后去看是不是在点或边上,但这样很麻烦需要求出任意两点的最短路,但这个数据范围是不允许的,然后就不会了,,,其实想的时候很多东西都没有注意到,n个点n-1条边的描述很像树,而且边的长度都是1,所以如果c到d是偶数的话说明是在城镇上,奇数的话说明就在边上,我们可以对这个树进行黑白染色,即根节点和下一层的子节点颜色不一样,那么如果颜色不一样说明就是奇数,颜色一样就是偶数,那这题就结束了;

#include<bits/stdc++.h>
#define ll long long
#define lowbit(i) ((-i)&(i))
using namespace std;
const ll inf=1e18;
const ll mod=998244353;
ll n,q,vis[100005];
vector<ll>v[100005];
void dfs(ll u,ll fa){
    for(int i=0;i<v[u].size();i++){
        ll j=v[u][i];
        if(j==fa) continue;
        vis[j]=!vis[u];
        dfs(j,u);
    }
}
int main(){
	//freopen("in.txt","r",stdin);
	scanf("%lld%lld",&n,&q);
	for(int i=1;i<n;i++){
        ll u,vv;
        scanf("%lld%lld",&u,&vv);
        v[u].push_back(vv);
        v[vv].push_back(u);
	}
	vis[1]=1;
	dfs(1,-1);
	for(int i=1;i<=q;i++){
        ll c,d;
        scanf("%lld%lld",&c,&d);
        if(vis[c]!=vis[d]) printf("Road\n");
        else printf("Town\n");
	}
	return 0;
}

添加括号 - 题目 - Daimayuan Online Judge

只看到了局部,没有看到整体,罪过啊罪过,上课前发现的规律是只有a2一定放下面,别的数放上面还是放下面要受前一个数的影响,这显然是错误的,因为只在意局部而没有去掌握整体,其实我们可以直接从a2前面加一个括号然后就变成了a1/(\frac{a2}{a3*a4*a5...}),转化一下也就是\frac{a1*a3*a4*a5...}{a2},所以只需要看一下除a2以外所有数的乘积能不能被a2整除就可以了,但是a的范围很大,我们改成让a2每次都除以gcd(a2,ai),当a2==1说明可以整除了;

#include<bits/stdc++.h>
#define ll long long
#define lowbit(i) ((-i)&(i))
using namespace std;
const ll inf=1e18;
const ll mod=998244353;
ll t,n,a[10005];
int main(){
	//freopen("in.txt","r",stdin);
	scanf("%lld",&t);
	while(t--){
        scanf("%lld",&n);
        for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
        ll flag=0;
        for(int i=1;i<=n;i++){
            if(i==2) continue;
            a[2]/=__gcd(a[2],a[i]);
            if(a[2]==1){
                flag=1;
                printf("Yes\n");
                break;
            }
        }
        if(!flag) printf("No\n");
	}
	return 0;
}

C-圣_牛客小白月赛49 (nowcoder.com)

(a[1]&a[1])|(a[1]&a[2])|(a[1]&a3])|(a[1]&a[4])|(a[1]&a[5])可以发现这些与项所得的结果中的1都是a[1]中的1,而a[1]&a[1]=a[1],所以他们或起来就是a[1],所以答案就是a[1]~a[n]的异或和

#include<bits/stdc++.h>
#define ll long long
#define lowbit(i) ((-i)&(i))
using namespace std;
const ll inf=1e18;
const ll mod=998244353;
ll t,n,a[100005];
int main(){
	//freopen("in.txt","r",stdin);
	scanf("%lld",&t);
	while(t--){
        scanf("%lld",&n);
        ll sum=0;
        for(int i=1;i<=n;i++){
            scanf("%lld",&a[i]);
            sum^=a[i];
        }
        printf("%lld\n",sum);
	}
	return 0;
}

D-梵_牛客小白月赛49 (nowcoder.com) 

是一个开口朝下的二次函数,而给的参数正好是两个零点,所以直接算a,b之间的和就可以,公式慢慢就能推出来了,但快速幂写错了,不然就过了,我真是个大伞兵;

#include<bits/stdc++.h>
#define ll long long
#define lowbit(i) ((-i)&(i))
using namespace std;
const ll inf=1e18;
const ll mod=998244353;
ll t,a,b;
ll qpow(ll a,ll b){
    ll res=1;
    while(b){
        if(b) res=res*a%mod;
        a=a*a%mod;
        b>>=1;
    }
    return res;
}
ll getinv(ll a){return qpow(a,mod-2);}
int main(){
	//freopen("in.txt","r",stdin);
	scanf("%lld",&t);
	while(t--){
        scanf("%lld%lld",&a,&b);
            ll n=((b-a)+1LL)%mod;
            ll ans1=(n*a%mod)*a%mod;
            ll ans2=(n*(n-1)%mod)*a%mod;
            ll ans3=((n*(n-1)%mod)*(2LL*n-1LL)%mod)*getinv(6LL)%mod;
            ll ans4=(n*a%mod)*b%mod;
            ll m=(a+b)%mod;
            ll ans5=((n*m%mod)*m%mod)*getinv(2LL)%mod;
            //cout<<ans1<<" "<<ans2<<" "<<ans3<<" "<<ans4<<" "<<ans5<<endl;
            ll ans=-ans1;
            ans=((ans-ans2)%mod+mod)%mod;
            ans=((ans-ans3)%mod+mod)%mod;
            ans=((ans-ans4)%mod+mod)%mod;
            ans=((ans+ans5)%mod+mod)%mod;
        printf("%lld\n",ans%mod);
	}
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

killer_queen4804

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值