Trig Function

题目内容
测试样例:
样例输入
2 0
2 1
2 2

样例输出
998244352
0
2

今天的西安赛区真的比较坑,完全都是模运算,所以也激起我要学透模运算。
加法模运算: (a+b)%mod=(a%mod+b%mod)%mod
减法模运算: (a-b)%mod=(a%mod-b%mod +mod)%mod
乘法模运算: (a*b)%mod=(a%mod*b%mod)%mod
除法模运算: (a/b)%mod=(a*b^(mod-2))%mod
(B关于mod的逆元就是b^(mod-2))
负数模运算: a%mod=(a%mod+mod)%mod (注意a为负数)
分数模比较难以理解推荐一篇比较好的博客。
http://www.cnblogs.com/dupengcheng/p/5487362.html
此次西安赛区的F题就是对除法模和负数模的运用。
AC代码:

#include<cstdio>
using namespace std;
typedef long long LL;
const LL MOD=998244353;
LL quick_pow(LL y,LL k)
{
    LL res = 1;
    while (k)
    {
        if (k & 1)
            res=(res* y)%MOD;
        y=(y*y)%MOD;
        k >>= 1;
    }
    return res;
}


LL fun1(LL n)
{
    LL t=1;
    for(LL i=n;i>=1;i--)
       t=(t*i)%MOD;
    return t;

}
LL fun2(LL n,LL m)
{
        LL count=1;
        while(n>m)
        {
            count=(count*n)%MOD;
            n=n-2;
        }
        return count;
}
int main()
{
       LL n,m;
       while(~scanf("%lld%lld",&n,&m))
       {

          if(n%2!=m%2||m>n)
          {
            printf("0\n");
            continue;
          }

          if(m==0)
          {
              printf("998244352\n");
              continue;
          }

          LL x,y;
          x=(n*fun2(n+m-2,n-m))%MOD;
          y=fun1(m);
          LL a=quick_pow(y,MOD-2);
          LL ans=(x*a)%MOD;
          if((n-m)/2%2)
           ans=(MOD-ans)%MOD;

          printf("%lld\n",ans);
       }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
function Trig_blizzard_intelligence________2_Func002002003001 takes nothing returns boolean return ( IsUnitType(GetFilterUnit(), UNIT_TYPE_STRUCTURE) == false ) endfunction function Trig_blizzard_intelligence________2_Func002002003002001 takes nothing returns boolean return ( IsUnitAliveBJ(GetFilterUnit()) == true ) endfunction function Trig_blizzard_intelligence________2_Func002002003002002 takes nothing returns boolean return ( IsUnitEnemy(GetFilterUnit(), GetOwningPlayer(udg_blizzard_hero)) == true ) endfunction function Trig_blizzard_intelligence________2_Func002002003002 takes nothing returns boolean return GetBooleanAnd( Trig_blizzard_intelligence________2_Func002002003002001(), Trig_blizzard_intelligence________2_Func002002003002002() ) endfunction function Trig_blizzard_intelligence________2_Func002002003 takes nothing returns boolean return GetBooleanAnd( Trig_blizzard_intelligence________2_Func002002003001(), Trig_blizzard_intelligence________2_Func002002003002() ) endfunction function Trig_blizzard_intelligence________2_Func003A takes nothing returns nothing call AddSpecialEffectTargetUnitBJ( "overhead", GetEnumUnit(), "Abilities\\Spells\\Other\\TalkToMe\\TalkToMe.mdl" ) call CreateNUnitsAtLoc( 1, 'e000', GetOwningPlayer(udg_blizzard_hero), udg_blizzard_p, bj_UNIT_FACING ) call UnitDamageTargetBJ( bj_lastCreatedUnit, GetEnumUnit(), ( I2R(GetHeroInt(udg_blizzard_hero, true)) * 0.65 ), ATTACK_TYPE_NORMAL, DAMAGE_TYPE_COLD ) endfunction function Trig_blizzard_intelligence________2_Actions takes nothing returns nothing call YDWELocalVariableInitiliation( ) call YDWESetLocalVariableGroup( "g", GetUnitsInRangeOfLocMatching(BlzGetAbilityRealLevelField(BlzGetUnitAbility(udg_blizzard_hero, 'AHMB'), ABILITY_RLF_AREA_OF_EFFECT, GetUnitAbilityLevelSwapped('AHMB', udg_blizzard_hero)), udg_blizzard_p, Condition(function Trig_blizzard_intelligence________2_Func002002003)) ) call ForGroup( YDWEGetLocalVariableGroup("g"), function Trig_blizzard_intelligence________2_Func003A ) call GroupClear( YDWEGetLocalVariableGroup("g") ) call DestroyGroup( YDWEGetLocalVariableGroup("g") ) call YDWELocalVariableEnd( ) endfunction //=========================================================================== function InitTrig_blizzard_intelligence________2 takes nothing returns nothing set gg_trg_blizzard_intelligence________2 = CreateTrigger( ) call TriggerRegisterTimerExpireEventBJ( gg_trg_blizzard_intelligence________2, udg_blizzard_inte ) call TriggerAddAction( gg_trg_blizzard_intelligence________2, function Trig_blizzard_intelligence________2_Actions ) endfunction这段代码
02-07
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值