1月13日
一场div2
Problem - A - Codeforces
Problem - B - Codeforces
Problem - C - Codeforces
下午
Bi-shoe and Phi-shoe - LightOJ 1370 - Virtual Judge
数论基础,
刚开始,想着用欧拉函数,然后再反映射一下,但是推了一下发现没必要,只要找大于这个数的最小的质数即可,
所以预处理:先筛出质数,再用二分找出大于每个数的最小质数,查询就O(1)
#include <bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
//typedef unsigned __int128 LL;
const int N=1000003,M=5e5+10,inf=1e16,mod=1e8;
int a[N];
int ans[N+10];
int vis[N]; //划掉合数
int prim[N]; //记录质数
int cnt; //质数个数void get_prim(int n) { //欧拉筛法-----O(N)vis[1]=1;for (int i = 2; i <= n; i++) {//越界中断if (!vis[i]) prim[++cnt] = i;for (int j = 1; i * prim[j] <= n; j++) {//乘以已经记录的数,越界中断,开筛vis[i * prim[j]] = 1;if (i % prim[j] == 0) break;//整除中断,保证被最小的质因子prim[j]划掉}}
}int tt;
void solve() {int n;cin>>n;int sum=0;for(int i=1;i<=n;i++) {cin>>a[i];sum+=ans[a[i]];}cout<<"Case "<<++tt<<": ";cout<<sum;cout<<" Xukha"<<endl;
}signed main() {ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);int T=1e6;get_prim(N);for(int i=1;i<=T;i++){int l=0,r=cnt+1;while(l+1<r){int mid=l+r>>1;if(prim[mid]>i) r=mid;else l=mid;}ans[i]=prim[r];}
// for(int i=1;i<=T;i++) cout<<ans[i]<<endl;
// cout<<ans[T]<<endl;int _;cin >> _;while (_--)solve();return 0;
}
Network - POJ 3694 - Virtual Judge
poj交不上去,所以这题没交,就不放代码了
思路:由于查询只有1000,n+m为2e6,时间五秒,所以发现是个大傻逼题,看着这么难,其实可以查询时tarjan,就是初始化数组有点烦。
最后做了一道水题
Caocao's Bridges - HDU 4738 - Virtual Judge
但是bri数组没有初始化,还花了点时间