提高组过渡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]
*/

 

posted on 2022-06-04 18:37  HZOI-曹蓉  阅读(43)  评论(0编辑  收藏  举报