博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
北京集训:20180318
阅读量:5124 次
发布时间:2019-06-13

本文共 7725 字,大约阅读时间需要 25 分钟。

果然我还是太菜了......

T1:

先分解成标准形式,然后每个质因数必须有最高次,然后状压DP?
发现并不可做......
然后写了10分的大力背包走了......
正解是容斥。

然而他的公式挂了......
大概意思就是枚举我们有几个没有到最高次,然后用高维前缀和(积)进行DP。
关于高维前缀和可以看我以前的博客......
为什么考场没想起来......
考场10分代码:

1 #include
2 #include
3 //#include
4 //#define debug cout 5 //using namespace std; 6 typedef long long int lli; 7 const int maxn=5e2+1e1,maxk=22; 8 const int mod=232792561; 9 10 lli f[2][maxn][maxk];11 int n,k;12 13 inline int gcd(int x,int y) {14 register int t;15 while( t = x % y )16 x = y , y = t;17 return y;18 }19 inline int lcm(int x,int y) {20 if( ! ( x && y ) ) return x | y;21 return x / gcd(x,y) * y;22 }23 inline void trans(lli dst[maxn][maxk],const lli sou[maxn][maxk],int now) {24 for(int i=0;i<=n;i++) {25 const int tar = lcm(i,now);26 if( tar > n ) continue;27 for(int j=0;j
View Code

正解代码:

1 //#include
2 #include
3 #include
4 //#include
5 //#define debug cout 6 typedef long long int lli; 7 //using namespace std; 8 const int maxl=2e5+1e2,maxd=2e1+1e1,maxp=7e1+1e1; 9 const int mod=232792561; 10 11 int k; 12 lli wpows[maxd]; 13 14 inline lli fastpow(lli base,int tim) { 15 lli ret = 1; 16 while( tim ) { 17 if( tim & 1 ) ret = ret * base % mod; 18 if( tim >>= 1 ) base = base * base % mod; 19 } 20 return ret; 21 } 22 23 struct Poly { 24 lli dat[maxd]; 25 Poly() { 26 memset(dat,0,sizeof(dat)); 27 } 28 inline void fill(int x) { // get point value expression , only p ^ x and p ^ 0 is 1 . 29 for(int i=0;i
View Code

T2:

显然是个反演+杜教筛......
三个gcd很不好办啊,拆了他也不好做,不如留着,万一大力出奇迹了呢......

前面是μ*id=φ,后面是x^2的前缀和,显然可以背过......
话说考场如果背不过怎么办呢?显然他是一个k+1次多项式,然后我们可以拉格朗日插值......
官方题解感觉推傻了......

考场AC代码:

1 //#include
2 #include
3 //#include
4 //#include
5 //#define debug cout 6 typedef long long int lli; 7 //using namespace std; 8 const int maxn=1e6+1e2,lim=1e6; 9 10 lli phi[maxn],mem[maxn],vis[maxn];11 int n,mod,inv;12 13 inline lli fastpow(lli base,int tim) {14 lli ret = 1;15 while( tim ) {16 if( tim & 1 ) ret = ret * base % mod;17 if( tim >>= 1 ) base = base * base % mod;18 }19 return ret;20 }21 22 inline void sieve() {23 static int vis[maxn],prime[maxn],cnt;24 phi[1] = 1;25 for(int i=2;i<=lim;i++) {26 if( !vis[i] ) prime[++cnt] = i , phi[i] = i - 1;27 for(int j=1;j<=cnt&&(lli)i*prime[j]<=lim;j++) {28 const int tar = i * prime[j];29 vis[tar] = 1; 30 if( i % prime[j] ) phi[tar] = phi[i] * ( prime[j] - 1 );31 else {32 phi[tar] = phi[i] * prime[j];33 break;34 }35 }36 }37 for(int i=1;i<=lim;i++) ( phi[i] += phi[i-1] ) %= mod;38 }39 40 inline lli sumphi(lli x) {41 if( x <= lim )42 return phi[x];43 lli mp = n / x;44 if( vis[mp] )45 return mem[mp];46 lli ret = ( (lli) x ) * ( x + 1 ) >> 1;47 for(lli i=2,j;i<=x;i=j+1) {48 j = x / ( x / i );49 ret -= ( j - i + 1 ) * sumphi( x / i );50 }51 vis[mp] = 1;52 return mem[mp] = ret;53 }54 55 inline lli sum(lli x) {56 return x * ( x + 1 ) % mod * ( ( 2 * x + 1 ) % mod ) % mod * inv % mod;57 }58 inline lli segphi(lli l,lli r) {59 return ( sumphi(r) - sumphi(l-1) + mod ) % mod;60 }61 inline lli calc(lli n) {62 lli ret = 0;63 for(lli i=1,j;i<=n;i=j+1) {64 j = n / ( n / i );65 ( ret += segphi(i,j) * sum( n / i ) % mod ) %= mod;66 }67 return ret;68 }69 70 int main() {71 scanf("%d%d",&n,&mod) , sieve();72 inv = fastpow(6,mod-2);73 printf("%lld\n",calc(n));74 return 0;75 }
View Code

T3:

字符串题,没时间了,写个20分暴力走了。
woc暴力怎么又WA了?
题解:

考场零分暴力:

1 //#include
2 #include
3 #include
4 //#include
5 #include
6 //#define debug cout 7 typedef long long int lli; 8 //using namespace std; 9 const int maxn=1e2+1e1,maxq=1e5+1e2;10 11 struct ACautomatic {12 int ch[maxn][26],fail[maxn],deg[maxn],sum[maxn],tim[maxn],root,cnt;13 ACautomatic() { root = ++cnt; }14 inline void insert(char* s,int li) {15 int now = root;16 for(int i=1;i<=li;i++) {17 const int t = s[i] - 'a';18 if( !ch[now][t] ) ch[now][t] = ++cnt;19 now = ch[now][t];20 }21 //debug<<"now = "<
<
q;26 for(int i=0;i<26;i++)27 if( !ch[root][i] ) ch[root][i] = i;28 else fail[ch[root][i]] = root , q.push(ch[root][i]);29 while( q.size() ) {30 const int pos = q.front(); q.pop();31 for(int i=0;i<26;i++)32 if( !ch[pos][i] ) ch[pos][i] = ch[fail[pos]][i];33 else fail[ch[pos][i]] = ch[fail[pos]][i] , q.push(ch[pos][i]);34 }35 }36 inline void pir(char* s,int li) {37 int now = root;38 for(int i=0;i
View Code

标程:

1 #include
2 #define ALPHA 27 3 #define N 55 4 #define M 100005 5 #define pii pair
6 #define mp(x,y) make_pair(x,y) 7 #define fr first 8 #define se second 9 using namespace std; 10 namespace AC{ 11 int ne[M][ALPHA],fail[M],val[M],cnt,root;//0~cnt-1 12 void insert(int &k,char *s,int len){ 13 if(k==0) k=++cnt; 14 if(len!=0) insert(ne[k][s[0]-'a'],s+1,len-1); 15 else val[k]++; 16 } 17 void buildAC(){ 18 fail[root]=root;queue
q; 19 for(int i=0;i<26;i++) 20 if(ne[root][i]==0) ne[root][i]=root; 21 else fail[ne[root][i]]=root,q.push(ne[root][i]); 22 while(!q.empty()){ 23 int u=q.front();q.pop(); 24 for(int i=0;i<26;i++){ 25 int &v=ne[u][i]; 26 if(v==0) v=ne[fail[u]][i]; 27 else fail[v]=ne[fail[u]][i],q.push(v),val[v]+=val[fail[v]]; 28 } 29 } 30 } 31 } 32 33 struct msg{ 34 int st[N],ans[N]; 35 pii query(pii x){ 36 return mp(st[x.fr],x.se+ans[x.fr]); 37 } 38 void merge(const msg &b){ 39 for(int i=0;i
>1; 86 build(k<<1,l,mid,s,pw-1); 87 build(k<<1|1,mid+1,r,s,pw-1); 88 update(k); 89 } 90 } 91 pii query(int k,int l,int r,pii input,int nl,int nr){ 92 if(nl==l&&nr==r) return a[k].x.query(input); 93 pushdown(k); 94 int mid=(nl+nr)>>1; 95 if(l>mid) return query(k<<1|1,l,r,input,mid+1,nr); 96 else if(r<=mid) return query(k<<1,l,r,input,nl,mid); 97 return query(k<<1|1,mid+1,r,query(k<<1,l,mid,input,nl,mid),mid+1,nr); 98 } 99 void modify(int k,int l,int r,int id,int st,int nl,int nr){100 if(nl==l&&nr==r){101 addmark(k,id,st);102 }else{103 pushdown(k);104 int mid=(nl+nr)>>1;105 if(l>mid) modify(k<<1|1,l,r,id,st,mid+1,nr);106 else if(r<=mid) modify(k<<1,l,r,id,st,nl,mid);107 else modify(k<<1,l,mid,id,st,nl,mid),modify(k<<1|1,mid+1,r,id,(st+mid-l+1)%lenth[id],mid+1,nr);108 update(k);109 }110 }111 }112 113 char s[(1<<18)+3],Ti[N];114 int n,m,q,pwlen;115 void readin(){116 //cerr<<(sizeof(ne)+sizeof(SGT::a))/1024/1024<
100000) {puts("Invaid Input2");return;}141 }142 int main(){143 144 readin();145 AC::buildAC();146 if(AC::cnt>50) return puts("Invaid Input1"),0;147 for(pwlen=0;(1<
View Code

 

转载于:https://www.cnblogs.com/Cmd2001/p/8597530.html

你可能感兴趣的文章
java SE :标准输入/输出
查看>>
[ JAVA编程 ] double类型计算精度丢失问题及解决方法
查看>>
好玩的-记最近玩的几个经典ipad ios游戏
查看>>
PyQt5--EventSender
查看>>
Sql Server 中由数字转换为指定长度的字符串
查看>>
tmux的简单快捷键
查看>>
[Swift]LeetCode922.按奇偶排序数组 II | Sort Array By Parity II
查看>>
Android打包key密码丢失找回
查看>>
VC6.0调试技巧(一)(转)
查看>>
类库与框架,强类型与弱类型的闲聊
查看>>
php match_model的简单使用
查看>>
SIP服务器性能测试工具SIPp使用指导(转)
查看>>
回调没用,加上iframe提交表单
查看>>
大话文本检测经典模型:EAST
查看>>
待整理
查看>>
一次动态sql查询订单数据的设计
查看>>
C# 类(10) 抽象类.
查看>>
Vue_(组件通讯)子组件向父组件传值
查看>>
jvm参数
查看>>
STM32单片机使用注意事项
查看>>