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前面加一个括号然后就变成了,转化一下也就是
,所以只需要看一下除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;
}