【HDU 6003】
UNSOLVED
【HDU 6004】
SOLVED
【题目大意】有一DAG图,n个节点,m次询问,每次询问两个节点,求令两个节点任意一个和叶节点失去联通的方法数
【思路】支配树,没有听说过于是被当场爆锤(知道了也是被锤的命QwQ)
#include#include #include #include #include #include<string> #include #include #include #include
【HDU 6005】
UNSOLVED
【HDU 6006】
UNSOLVED
【HDU 6007】
UNSOLVED
【HDU 6008】
SOLVED
【思路】循环节
#include#include #include #include #include #include using namespace std; using ll = long long int; ll T, x, n, ans; ll a[]={2, 3, 5, 7, 11, 13, 17, 19}; ll pow_mul(ll a, ll b, ll r) { ll ans = 0; while(b) { if(b & 1) ans = (ans + a) % r; a = (a + a) % r; b >>= 1; } return ans % r; } ll pow_mod(ll a, ll b, ll r) { ll ans = 1; while(b) { if(b & 1) ans = pow_mul(ans, a, r) % r; a = pow_mul(a, a, r) % r; b >>= 1; } return ans % r; } bool test(ll a, ll p, ll d) { if(p % 2 == 0) return false; while(!(d & 1)) d >>= 1; ll t = pow_mod(a, d, p); //得到 a^d % p while(d != p - 1) { ll y = pow_mul(t, t, p); // t^2 % p if(y == 1) { if(t != 1 && t != p - 1) return false;//不满足二次探测定理 return true; //满足的话后面的肯定也满足了 因为此时y = 1 } t = y; d <<= 1; } return t == 1; //最后一次测试 a^(p - 1) % p = 1 } bool isprime(ll x) { for(int i = 0; i < 8; i ++) { if(a[i] == x) return true; if(!test(a[i], x, x - 1)) return false; } return true; }ll mul(ll a,ll b,ll mod) { ll ret = 0; while (b) { if (b & 1) ret = (a + ret) % mod; b >>= 1; a = (a + a) % mod; } return ret; } ll quicmod(ll a,ll b,ll mod) { ll ret = 1; while (b) { if (b & 1) { ret = mul(ret,a,mod); } b >>= 1; a = mul(a,a,mod); } return ret; } int main() { int T; scanf("%d",&T); while (T--) { ll p,Q,ret = 0; scanf("%lld",&Q); p = Q - 1; ret = Q - 1; while (isprime(p) == 0) ret = mul(ret,quicmod(p,Q - 2,Q),Q),p--; printf("%lld\n",ret); } return 0; }
【HDU 6009】
SOLVED
【题目大意】一个数列,令1<=i<=n,每个wi都有都要满足到此前缀和小于m,如果大于则需要从前i-1个数中删除,直到符合条件,输出每位最少需要删除的数字个数
【思路】有点类似主席树,建一颗值域线段树,每次遍历动态更新节点,然后保存和,然后二分向下查找
#include#include #include #include #include #include<string> #include #include #include #include
【HDU 6010】
UNSOLVED
【HDU 6011】
UNSOLVED
【HDU 6012】
UNSOLVED
【HDU 6013】
UNSOLVED