提高组过渡1
分数:0
刻骨铭心!!!!
T1:找规律题
想一想自己手模怎么做,基本上就出来了
失分原因:1.逻辑漏洞:找中间数的时候,出现4 4 1中间数找成了1,直接0
2.long long 数据范围没有超过,但是*2就超过0x7f7f7f7f了,注意
T2:
在 行 列的棋盘上,放若干个炮可以是 个,使得没有任何一个炮可以攻击另一个炮。请问有多少种放置方法,中国像棋中炮的攻击方式大家应该很清楚吧,需要隔一颗棋子攻击。
输入格式
一行包含两个整数 ,中间用空格分开。
输出格式
输出所有的方案数 。
dp,用不着状压,数据超过30了
失分:死想着状压不会了
const int N=2000+10,M=320; int mod=9999973; int f[108][108][108]; int n,m; int main() { freopen("chess.in","r",stdin); freopen("chess.out","w",stdout); n=re(),m=re(); if(n<m) { swap(n,m); } f[1][1][m-1]=m;//第一行放了一个 f[1][0][m]=1;//第一行只能j+k==m因为不可能一列有两个 一个也不放 f[1][2][m-2]=m*(m-1)/2; //放了两个 _f(i,2,n) { _f(j,0,m) _f(k,0,m-j) { f[i][j][k]=f[i-1][j][k];//le7* if(j-1>=0)f[i][j][k]=(f[i][j][k]+1LL*f[i-1][j-1][k+1]*(k+1)%mod); f[i][j][k]=(f[i][j][k]+1LL*f[i-1][j+1][k]*(j+1)%mod); f[i][j][k]=(f[i][j][k]+1LL*f[i-1][j][k+1]*j*(k+1)%mod); if(j-2>=0)f[i][j][k]=(f[i][j][k]+1LL*f[i-1][j-2][k+2]*(k+2)*(k+1)/2%mod); f[i][j][k]=(f[i][j][k]+1LL*f[i-1][j+2][k]*(j+2)*(j+1)/2%mod); f[i][j][k]%=mod; //chu("f[%d][%d][%d]:%d\n",i,j,k,f[i][j][k]); } } int ans=0; _f(i,0,m) _f(j,0,m-i) { ans+=f[n][i][j]; ans%=mod; } chu("%d",ans); return 0; } /* f[i][j][k]: 第i行有j列放了1个棋子,k列放了0个棋子的方案数量 */
T3数论
wrong:a|b(a整除b),b%a==0,我理解错了,30也没拿
C. 奇妙的 Fibonacci - 【比赛】高一提高组过渡1 - 比赛 - 衡中OI (hszxoj.com)
void shai() { int dao=10000007; a[1]=1;b[1]=1; _f(i,2,10000007)//? { if(!vis[i]) { zhi[++cnt]=i; a[i]=2; //chu("a[%d]=%d\n",i,a[i]); b[i]=(1LL*i*i+1)%mod; c[i]=1; d[i]=1; } _f(j,1,cnt) { if(zhi[j]*i>dao)break; int now=zhi[j]*i; vis[now]=1;//是合数 if(i%zhi[j]==0) { a[now]=(a[i]/(c[i]+1)*(c[i]+2)*1LL)%mod; //b[now]=(b[i]+1LL*(b[d[i]]*(i/d[i])*(i/d[i]))%mod)%mod; b[now]=(b[d[i]]+(b[i]*zhi[j])%mod*zhi[j]%mod)%mod; c[now]=c[i]+1; d[now]=d[i]; break; } a[now]=1LL*a[i]*a[zhi[j]]%mod; b[now]=1LL*b[i]*b[zhi[j]]%mod; c[now]=1; d[now]=i;//除去最小质因子后生下的数,1次就是i } } } ll aa,bb,cc,qq; int Q; ll ans1,ans2; int main() { freopen("fibo.in","r",stdin); freopen("fibo.out","w",stdout); shai(); scanf("%d",&Q); scanf("%lld %lld %lld %lld",&qq,&aa,&bb,&cc); while(Q--) { ans1=(ans1+a[qq])%mod; ans2=(ans2+b[qq])%mod; if(qq & 1) ans1 = (ans1 + 1) % mod, ans2 = (ans2 + 4) % mod; qq=(qq*aa+bb)%cc+1; } chu("%lld\n%lld",ans1,ans2); return 0; } /* Fib(Standard) 结论:fi|fj,则 i|j。 证明: 首先 fi=fi-1+fi-2. 可以理解为 fi = fi-2 *f1 + fi-1 * f2 ; (f1=f2=1) 升级一下 fi = fi-3 * f2 + fi-2 * f3。 证明上式: F3=f1+f2 Fi=fi-3 * f2 + fi-2 * (f1 + f2) =fi-3 * f2 + fi-2 * f2 + fi-2 * f1 =(fi-3 + fi-2) * f2 + fi-2 * f1 =fi-1 * f2 + fi-2 * f1 同理可以证明:fi = fi-k * fk-1 + fi-k+1 * fk 不停的带入 fk 来证明即可。 上式和 fn+m = fn-1 * fm + fn * fm+1 一样。------------------① 然后由于 f1=1,f2=1,f3=2,发现两两互质关系。 即 gcd(f1,f2)=1,gcd(f2,f3)=1。 由辗转相减法可以求 gcd(fi,fi-1) Gcd(fi,fi-1)=gcd(fi-fi-1,fi-1)=gcd(fi-2,fi-1)。 i 减小了 1。 减到最后 gcd(f1,f2)=1。所以说 gcd(fi,fi-1)=1 对任意 i 成立。-------------② 所以 gcd(fn+m,fm)=gcd(fn-1 * fm + fn * fm+1,fm) =gcd(fn-1 * fm + fn * fm+1 – fm –fm –fm –fm –fm…,fm) =gcd(fn * fm+1,fm) =gcd(fn,fm) 类比 gcd(n+m,m)=gcd(n,m),最后求出来的 gcd 一定是 n+m 的约数。 同理 gcd(fn+m,fm)=gcd(fn,fm),最后求出来的 gcd 一定是 f(n+m)的约数。 也就是说,对于相同的 n,m,上述两个整除关系同时成立。 也就是说,当 fi|fj 时,i|j。 因此本题就转化成了求 Qi 的约数个数和约数平方和。 这些都可以用线性筛来解决。 求q的因数,和因数的平方和 a[]代表因数个数 b[]代表因数平方和 c[]代表最小质因子的次幂 d[]代表除掉最小质因子剩下的数字 2 2 2 1 8 a[]b[]满足互质积性 g是最小质因子 当gcd(g,f) =1 a[gf]=a[g]*a[f]//唯一分解定理:s=ai^qi+aj^qj+.....则a[s]=(qi+1)*(qj+1)*...//每一个质因子都可以任意取 b[gf]=b[g]*b[f] c[gf]= d[gf]= 当g|f a[gf]=a[f]/(c[f]+1)*(c[f]+2) b[gf]=b[d[f]]+b[f]*g*g//原来的f组合(没有g质因子)+我又在g这个质因子次幂上加了一项的所有组合 c[gf]=c[f]+1 d[gf]=d[f] Q ans1+=a[Q] ans2+=b[Q] */