NC201685. 染色图
描述
输入描述
第一行输入一个整数 ,表示数据组数。
对于每组数据,输入三个整数 。
输出描述
对于每组数据,输出一行一个整数表示答案。
示例1
输入:
5 3 1 1 3 2 2 5 2 4 10 3 9 1000 123 789
输出:
0 2 23 280 332539617
C++14(g++5.4) 解法, 执行用时: 7ms, 内存消耗: 468K, 提交时间: 2020-01-20 16:31:05
#include<bits/stdc++.h> using namespace std; typedef long long ll; int T; const int two=499122177; const int mod=998244353; ll n,x,y,tmp; int main() { scanf("%d",&T); while(T--) { ll ans=0; scanf("%lld%lld%lld",&n,&x,&y); for(ll l=x,r;l<=y;l=r+1) { r=n/(n/l); if(r>y) r=y; tmp=n/l; ans+=(n*n%mod-n-2*n%mod*tmp%mod+mod)%mod*(r-l+1)%mod+((r-l+1)*(r+l)/2)%mod*((tmp*tmp+tmp)%mod)%mod; ans%=mod; } ans=(ans+mod)%mod; ans=ans*two%mod; printf("%lld\n",ans); } return 0; }
C++11(clang++ 3.9) 解法, 执行用时: 7ms, 内存消耗: 484K, 提交时间: 2020-04-26 22:13:51
#include<bits/stdc++.h> #define ll long long using namespace std; const ll p=998244353; int main(){ ll t1,n,l,r,le,re,x,st,ed,ans; scanf("%lld",&t1); while(t1--){ scanf("%lld%lld%lld",&n,&le,&re); ans=0; for(l=le;l<=re;l=r+1){ r=min(re,n/(n/l)); x=n/l; st=n%l; ed=st-(r-l)*x; ans=(ans+(st+ed)*(r-l+1)/2%p*x%p+x*(x-1)/2%p*((l+r)*(r-l+1)/2%p)%p)%p; } ans=(n*(n-1)/2%p*(re-le+1)%p-ans+p)%p; printf("%lld\n",ans); } }