B题
- 题目链接
点这里 - 题意
- 思路
血的教训呀,特殊情况考虑不到。
先说思路吧。就是可以根据样例直接猜出来做法。中间还有一段时间走错了路。哎,菜是原罪!
就是先找到第一个包含x的区间,然后依次扩展。
第一点错误:
扩展的时候一定要可扩展。
if(a[i].x<l)
{
res+=(l-a[i].x);
l=a[i].x;
m1--;
}
if(a[i].y>r)
{
res+=(r-a[i].y);
r=a[i].y;
}
要这样写才正确。
if(a[i].x<l&&a[i].y>=l){
res+=(l-a[i].x);
l=a[i].x;
}
if(a[i].y>r&&a[i].x<=r){
res+=(a[i].y-r);
r=a[i].y;
}
- 代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=110;
#define PII pair<int,int>
PII a[N];
#define x first
#define y second
void solve()
{
int n,m,x1;
cin>>n>>x1>>m;
for(int i=1; i<=m; i++) cin>>a[i].x>>a[i].y;
ll res=0;
int l,r;
int m1=m;
for(int i=1; i<=m; i++)
{
if(m1==m&&a[i].x<=x1&&x1<=a[i].y)
{
res+=(a[i].y-a[i].x+1);
l=a[i].x;
r=a[i].y;
m1--;
}
else if(m1==m)
continue;
else
{
if(a[i].x<l&&a[i].y>=l)
{
res+=(l-a[i].x);
l=a[i].x;
}
if(a[i].y>r&&a[i].x<=r)
{
res+=(a[i].y-r);
r=a[i].y;
}
}
//cout<<res<<endl;
}
res=max(1*1ll,res);
cout<<res<<endl;
}
int main()
{
int t;
cin>>t;
while(t--)
solve();
}
C题
- 题意
- 思路
可以直接看代码 - 代码
#include<bits/stdc++.h>
using namespace std;
const int N=110;
int a[N][N],sum0[N],sum1[N];
//sum0存储的是第i步上0的个数,sum1存储的是第i步上1的个数。对称步数上应该要么全是1,要么全是0;
void solve()
{
memset(sum0,0,sizeof(sum0));//一定要记得初始化
memset(sum1,0,sizeof(sum1));
int n,m;cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++) cin>>a[i][j];
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
if(a[i][j]) sum1[i+j-1]++;
else sum0[i+j-1]++;
}
int res=0;
for(int i=1;i<=(n+m-1)/2;i++)
{
sum0[i]+=sum0[n+m-i];
sum1[i]+=sum1[n+m-i];
res+=min(sum0[i],sum1[i]);
}
cout<<res<<endl;
}
int main()
{
int t;
cin>>t;
while(t--)
solve();
}
D题
- 题意
- 思路(转载至)
设 p 1 p 2 p 3 … p m p_1 ~ p_2~ p_3~ … ~ p_m p1 p2 p3 … pm 为 a i a_i ai 的质因子 , d 1 = p 1 k , d 2 = a i / p 1 k d_1 = p_1^k , d_2 = a_i / p_1^k d1=p1k,d2=ai/p1k
其中 p 1 p_1 p1 为 a i a_i ai 的最小质因子 , a i a_i ai % p 1 k p_1^k p1k = 0 且 a i a_i ai % p 1 ( k + 1 ) ! = 0 p_1 ^ {(k + 1)} != 0 p1(k+1)!=0
那么显然 ( d 1 + d 2 ) (d_1+d_2) (d1+d2)% p 1 ≠ 0 , ( d 1 + d 2 ) p_1≠0, (d_1+d_2) p1=0,(d1+d2)% p 2 ≠ 0 , … , ( d 1 + d 2 ) p_2≠0 ,…,(d1+d2) p2=0,…,(d1+d2)% p m ≠ 0 p_m≠0 pm=0
所以 a i a_i ai 的所有质因子 d 1 + d 2 d_1 + d_2 d1+d2 都不包含 , 即 d 1 + d 2 d_1 + d_2 d1+d2 与 a i a_i ai 互质 ( 当 d 2 d_2 d2 = 1 时答案为 -1 )
而本题数据范围很大 , 所以我们得先用线性筛找出 1 − 1 e 7 1-1e^7 1−1e7 内每个数的 p 1 p_1 p1 然后再操作
- 代码
#include<bits/stdc++.h>
using namespace std;
int prime[10000100],minprime[10000100];
int euler(int n)
{
int c = 0;
for(int i = 2 ; i <= n ; i ++)
{
if(!minprime[i]) prime[++ c] = i , minprime[i] = i;
for(int j = 1 ; j <= c && i * prime[j] <= n ; j++)
{
minprime[i * prime[j]] = prime[j];
if(i % prime[j] == 0) break;
}
}
return c;
}
const int N = 5e5 + 10;
int n , a[N] , ans[N][2];
signed main()
{
ios::sync_with_stdio(false);
euler(1e7);
cin >> n;
for(int i = 1 ; i <= n ; i ++) cin >> a[i];
for(int i = 1 ; i <= n ; i ++)
{
int x = a[i] , now = 1 , mi = minprime[x];
while(x % mi == 0) x /= mi , now *= mi;
if(now != 1 && x != 1) ans[i][0] = now , ans[i][1] = x;
else ans[i][0] = -1 , ans[i][1] = -1;
}
for(int j = 0 ; j <= 1 ; j ++)
{
for(int i = 1 ; i <= n ; i ++) cout << ans[i][j] << " ";
cout << '\n';
}
return 0;
}